This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

library(raster)
size_dat=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/fire_growth_5days_v4.txt", header=T, row.names=NULL)

size_dat=as.data.frame(size_dat)
size_dat=size_dat[-1,]
size_dat=size_dat[,-1]
colnames(size_dat)=c("firename","year","cause","size1","size2","size3","size4","size5","final_firesize","mean_precip1","mean_precip2","mean_precip3","mean_precip4","mean_precip5","mean_tmax1","mean_tmax2","mean_tmax3","mean_tmax4","mean_tmax5","mean_tmean1","mean_tmean2","mean_tmean3","mean_tmean4","mean_tmean5","mean_vpdmax1","mean_vpdmax2","mean_vpdmax3","mean_vpdmax4","mean_vpdmax5","mean_windspeed1","mean_windspeed2","mean_windspeed3","mean_windspeed4","mean_windspeed5","landcover","ecosystem","biomass","elevation")

size_dat2 <- data.frame(lapply(size_dat, function(x) as.numeric(as.character(x))))
NAs introduced by coercion
size_dat2$human = 0
size_dat2$human[size_dat2$cause !=1 & size_dat2$cause !=14 & size_dat2$cause !=17]=1
size_dat2$human[size_dat2$cause ==1 ]=2

pro1 =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1 ), ]
pro2 =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1 ), ]

t.test(pro1$size1,pro2$size1)

    Welch Two Sample t-test

data:  pro1$size1 and pro2$size1
t = -2.0397, df = 74.381, p-value = 0.04493
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -22.0986230  -0.2593373
sample estimates:
mean of x mean of y 
 3.056385 14.235365 
t.test(pro1$size2,pro2$size2)

    Welch Two Sample t-test

data:  pro1$size2 and pro2$size2
t = -2.758, df = 73.138, p-value = 0.007341
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -32.702045  -5.266208
sample estimates:
mean of x mean of y 
 8.254394 27.238521 
t.test(pro1$size3,pro2$size3)

    Welch Two Sample t-test

data:  pro1$size3 and pro2$size3
t = -2.9002, df = 58.203, p-value = 0.005254
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -51.965993  -9.526741
sample estimates:
mean of x mean of y 
 14.10484  44.85121 
t.test(pro1$size4,pro2$size4)

    Welch Two Sample t-test

data:  pro1$size4 and pro2$size4
t = -3.1797, df = 53.078, p-value = 0.002461
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -74.99798 -16.98040
sample estimates:
mean of x mean of y 
 17.68430  63.67349 
t.test(pro1$size5,pro2$size5)

    Welch Two Sample t-test

data:  pro1$size5 and pro2$size5
t = -3.4218, df = 39.443, p-value = 0.001462
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -117.71273  -30.26844
sample estimates:
mean of x mean of y 
 19.71795  93.70853 
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 68
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 1), ]
length(pro$year)
[1] 77
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 1 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 18
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2 & size_dat2$landcover == 2), ]
length(pro$year)
[1] 9
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

length(!is.na(pro$size5))
[1] 9
pro =size_dat2[which(size_dat2$human == 1 & size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 41
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)


pro =size_dat2[which(size_dat2$human == 2& size_dat2$ecosystem == 6), ]
length(pro$year)
[1] 79
boxplot(pro$size1,pro$size2,pro$size3,pro$size4,pro$size5,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,500), cex.lab=1.4,cex.axis = 1.3)

NA
NA

plot fire size map QGIS

library(data.table)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
data.table 1.13.0 using 1 threads (see ?getDTthreads).  Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********

Attaching package: ‘data.table’

The following object is masked from ‘package:raster’:

    shift
DT= data.table(res)
fire_size = DT[ , .SD[which.min(growth_km)], by = firename]
Error in .checkTypos(e, names_x) : 
  Object 'growth_km' not found amongst bi, erc, etr, fm100, fm1000 and 23 more
extract number and size statistics from frap

library(raster)

dr1 =shapefile("/Users/stijnhantson/Documents/data/FRAP/fire18_1.shp")
dr1$YEAR_=as.numeric(as.character(dr1$YEAR_))
dr1$Shape_Area=as.numeric(as.character(dr1$Shape_Area))
dr1$ALARM_DATE = as.Date(dr1$ALARM_DATE )
dr1=dr1[!is.na(dr1$YEAR_), ]
dr1=dr1[dr1$YEAR_>2011,]


dr2=dr1[dr1$YEAR_ == 2013,]
plot(table(dr2$ALARM_DATE), xlim=c(as.Date("2013/01/01"),as.Date("2013/12/31")))

table(factor(dr2$ALARM_DATE, levels = as.Date("2013/01/01"):as.Date("2013/12/31")))

15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 
    0     0     0     0     0     0     0     0     0     0     0     0     0     0     0 
16066 16067 16068 16069 16070 
    0     0     0     0     0 

human lightning unknown ratio through time



library(raster)
library(rgdal)
package ‘rgdal’ was built under R version 3.6.2rgdal: version: 1.5-12, (SVN revision 1018)
Geospatial Data Abstraction Library extensions to R successfully loaded
Loaded GDAL runtime: GDAL 2.4.2, released 2019/06/28
Path to GDAL shared files: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/gdal
GDAL binary built with GEOS: FALSE 
Loaded PROJ runtime: Rel. 5.2.0, September 15th, 2018, [PJ_VERSION: 520]
Path to PROJ shared files: /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/proj
Linking to sp version:1.4-2
Overwritten PROJ_LIB was /Library/Frameworks/R.framework/Versions/3.6/Resources/library/rgdal/proj
library(rgeos)
package ‘rgeos’ was built under R version 3.6.2rgeos version: 0.5-3, (SVN revision 634)
 GEOS runtime version: 3.7.2-CAPI-1.11.2 
 Linking to sp version: 1.4-1 
 Polygon checking: TRUE 
library(sf)
frap=readOGR("/Users/stijnhantson/Documents/data/FRAP/fire19_1.shp")
OGR data source with driver: ESRI Shapefile 
Source: "/Users/stijnhantson/Documents/data/FRAP/fire19_1.shp", layer: "fire19_1"
with 20820 features
It has 18 fields
Integer64 fields read as strings:  CAUSE C_METHOD OBJECTIVE 
shape = shapefile("/Users/stijnhantson/Documents/data/veg_california/ca_eco_l3/ca_eco_l3.shp")
shape = spTransform(shape,crs(frap))


frap = st_make_valid(st_read("/Users/stijnhantson/Documents/data/FRAP/fire19_1.shp"))
Reading layer `fire19_1' from data source `/Users/stijnhantson/Documents/data/FRAP/fire19_1.shp' using driver `ESRI Shapefile'
GDAL Message 1: organizePolygons() received an unexpected geometry.  Either a polygon with interior rings, or a polygon with less than 4 points, or a non-Polygon geometry.  Return arguments as a collection.GDAL Message 1: Geometry of polygon of fid 19691 cannot be translated to Simple Geometry. All polygons will be contained in a multipolygon.
Simple feature collection with 20820 features and 18 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -373237.5 ymin: -604727.6 xmax: 519987.8 ymax: 518283.7
CRS:            3310
types <- vapply(sf::st_geometry(frap), function(x) {
  class(x)[2]
}, "")
polys <- frap[ grepl("*POLYGON", types), ]

frap=sf:::as_Spatial(polys)
frap=gBuffer(frap, byid=T,  width=0.0)
eco_inter=intersect(frap,shape)
NA
  1. frap
  2. only fire growth datasets
  • prepare final dataset to open

library(raster)
#library(rgdal)
daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/final_dataset_V5.txt",header=T)

res=as.data.frame(daily_res)

res$mean_ros =as.numeric(as.character(res$mean_ros))
res$max_ros =as.numeric(as.character(res$max_ros))
res$median95_ros =as.numeric(as.character(res$median95_ros))
res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
#res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$growth =as.numeric(as.character(res$growth))
res$total_area =as.numeric(as.character(res$total_area))
res$mean_frp =as.numeric(as.character(res$mean_frp))
res$frp_95 =as.numeric(as.character(res$frp_95))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))
res$biomass =as.numeric(as.character(res$biomass))
res$year =as.numeric(as.character(res$year))
res$month =as.numeric(as.character(res$month))
res$doy_out =as.numeric(as.character(res$doy_out))

res$mean_dnbr =as.numeric(as.character(res$mean_dnbr))
res$mean_rdnbr =as.numeric(as.character(res$mean_rdnbr))
res$mean_bas =as.numeric(as.character(res$mean_bas))
res$median_dnbr =as.numeric(as.character(res$median_dnbr))
res$median_rdnbr =as.numeric(as.character(res$median_rdnbr))
res$median_bas =as.numeric(as.character(res$median_bas))
res$q95_dnbr =as.numeric(as.character(res$q95_dnbr))
res$q95_rdnbr =as.numeric(as.character(res$q95_rdnbr))
res$q95_bas =as.numeric(as.character(res$q95_bas))


res = res[-1,]
res$per_ba = res$growth/res$total_area
res$growth_km =res$growth/1000000

res$human = 0
res$human[res$cause !=1 & res$cause !=14 & res$cause !=17]=1
res$human[res$cause ==1 ]=2

res$ros_km = (res$median95_ros*24)/1000
res$ros_mean_km = (res$mean_ros*24)/1000

is there relation between days untill 75% and fire size

dr1 =shapefile("/Users/stijnhantson/Documents/data/FRAP/fire18_1.shp")
dr1$YEAR_=as.numeric(as.character(dr1$YEAR_))
dr1$Shape_Area=as.numeric(as.character(dr1$Shape_Area))
dr1=dr1[!is.na(dr1$YEAR_), ]
dr1=dr1[dr1$YEAR_>2011,]

fi = dr1[dr1$OBJECTID==17495,]
dr1=subset(dr1, GIS_ACRES>300)

summary(dr1)
Object of class SpatialPolygonsDataFrame
Coordinates:
        min      max
x -332881.6 349023.3
y -601475.0 462306.3
Is projected: TRUE 
proj4string :
[+proj=aea +lat_1=34 +lat_2=40.5 +lat_0=0 +lon_0=-120 +x_0=0 +y_0=-4000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0
+units=m +no_defs]
Data attributes:
    OBJECTID         YEAR_         STATE              AGENCY            UNIT_ID           FIRE_NAME           INC_NUM         
 Min.   :11970   Min.   :2012   Length:515         Length:515         Length:515         Length:515         Length:515        
 1st Qu.:17777   1st Qu.:2014   Class :character   Class :character   Class :character   Class :character   Class :character  
 Median :19129   Median :2016   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 Mean   :19125   Mean   :2015                                                                                                 
 3rd Qu.:20512   3rd Qu.:2017                                                                                                 
 Max.   :21127   Max.   :2018                                                                                                 
                                                                                                                              
  ALARM_DATE         CONT_DATE            CAUSE             COMMENTS           REPORT_AC          GIS_ACRES       
 Length:515         Length:515         Length:515         Length:515         Min.   :     0.0   Min.   :   303.8  
 Class :character   Class :character   Class :character   Class :character   1st Qu.:   504.1   1st Qu.:   612.4  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :  1651.5   Median :  1707.6  
                                                                             Mean   : 12021.3   Mean   : 12138.1  
                                                                             3rd Qu.:  6970.0   3rd Qu.:  7068.0  
                                                                             Max.   :410203.0   Max.   :410202.5  
                                                                             NA's   :67                           
   C_METHOD          OBJECTIVE           FIRE_NUM           Shape_Leng       Shape_Area       
 Length:515         Length:515         Length:515         Min.   :  4635   Min.   :1.229e+06  
 Class :character   Class :character   Class :character   1st Qu.: 10017   1st Qu.:2.478e+06  
 Mode  :character   Mode  :character   Mode  :character   Median : 17475   Median :6.910e+06  
                                                          Mean   : 41493   Mean   :4.912e+07  
                                                          3rd Qu.: 37905   3rd Qu.:2.860e+07  
                                                          Max.   :445282   Max.   :1.660e+09  
                                                                                              
res75 = res[res$per_ba > 0.999,]

peak_day1 = as.data.frame(aggregate(res75$fire_day, by = list(res75$firename,res75$year), min))
p=13
year1=0
first=0
last=0
len_d=0
day75=0
firenam1=0
name_fire=0
size=0
k=0
for (p in 1:(length(peak_day1$Group.1)))
{
  print(p)
  year = peak_day1[p,2]
    firenam = as.character(peak_day1[p,1]) 
  
  fir = dr1[which(dr1$YEAR_==year & dr1$FIRE_NAME==firenam),]
  if (length(fir)>1){
    maxsize = max(fir$GIS_ACRES)
    fir = fir[fir$GIS_ACRES ==  maxsize,]
  }
  
  if (!is.na(fir$ALARM_DATE)  | !is.na(fir$ALARM_DATE)){
    k=k+1
    day75[k] = peak_day1[p,3]
    firenam1[k]=firenam 
  year1[k] = year
  first[k]= fir$ALARM_DATE
  last[k] = fir$CONT_DATE
  len_d[k] = as.numeric(as.Date(fir$CONT_DATE) -as.Date(fir$ALARM_DATE))
 name_fire[k]= fir$OBJECTID
    size[k] = fir$GIS_ACRES
  }
}
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
[1] 12
[1] 13
[1] 14
[1] 15
[1] 16
[1] 17
[1] 18
[1] 19
[1] 20
[1] 21
[1] 22
[1] 23
[1] 24
[1] 25
[1] 26
[1] 27
[1] 28
[1] 29
[1] 30
[1] 31
[1] 32
[1] 33
[1] 34
[1] 35
[1] 36
[1] 37
[1] 38
[1] 39
[1] 40
[1] 41
[1] 42
[1] 43
[1] 44
[1] 45
[1] 46
[1] 47
[1] 48
[1] 49
[1] 50
[1] 51
[1] 52
[1] 53
[1] 54
[1] 55
[1] 56
[1] 57
[1] 58
[1] 59
[1] 60
[1] 61
[1] 62
[1] 63
[1] 64
[1] 65
[1] 66
[1] 67
[1] 68
[1] 69
[1] 70
[1] 71
[1] 72
[1] 73
[1] 74
[1] 75
[1] 76
[1] 77
[1] 78
[1] 79
[1] 80
[1] 81
[1] 82
[1] 83
[1] 84
[1] 85
[1] 86
[1] 87
[1] 88
[1] 89
[1] 90
[1] 91
[1] 92
[1] 93
[1] 94
[1] 95
[1] 96
[1] 97
[1] 98
[1] 99
[1] 100
[1] 101
[1] 102
[1] 103
[1] 104
[1] 105
[1] 106
[1] 107
[1] 108
[1] 109
[1] 110
[1] 111
[1] 112
[1] 113
[1] 114
[1] 115
[1] 116
[1] 117
[1] 118
[1] 119
[1] 120
[1] 121
[1] 122
[1] 123
[1] 124
[1] 125
[1] 126
[1] 127
[1] 128
[1] 129
[1] 130
[1] 131
[1] 132
[1] 133
[1] 134
[1] 135
[1] 136
[1] 137
[1] 138
[1] 139
[1] 140
[1] 141
[1] 142
[1] 143
[1] 144
[1] 145
[1] 146
[1] 147
[1] 148
[1] 149
[1] 150
[1] 151
[1] 152
[1] 153
[1] 154
[1] 155
[1] 156
[1] 157
[1] 158
[1] 159
[1] 160
[1] 161
[1] 162
[1] 163
[1] 164
[1] 165
[1] 166
[1] 167
[1] 168
[1] 169
[1] 170
[1] 171
[1] 172
[1] 173
[1] 174
[1] 175
[1] 176
[1] 177
[1] 178
[1] 179
[1] 180
[1] 181
[1] 182
[1] 183
[1] 184
[1] 185
[1] 186
[1] 187
[1] 188
[1] 189
[1] 190
[1] 191
[1] 192
[1] 193
[1] 194
[1] 195
[1] 196
[1] 197
[1] 198
[1] 199
[1] 200
[1] 201
[1] 202
[1] 203
[1] 204
[1] 205
[1] 206
[1] 207
[1] 208
[1] 209
[1] 210
[1] 211
[1] 212
plot(len_d,day75, xlab="fire duration FRAP (days)", ylab="fire duration VIIRS (days)")

plot mean vs max fire rate-of-spread

#summary(res)
plot(res$ros_km,res$ros_mean_km, xlab="maximum fire-spread-rate (km/day",ylab="mean fire-spread-rate (km/day)")


pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/mean_vs_max_ros_v1.pdf", width = 7, height = 7)
plot(res$ros_km,res$ros_mean_km, xlim=c(0,25),ylim=c(0,10), xlab="fire rate-of-spread (km/day)",ylab="mean fire rate-of-spread (km/day)", cex.lab=1.3,cex.axis = 1.25)
dev.off()
quartz_off_screen 
                2 

difference between human and lightnign fires

me=0
me1=0
days = c("day1","day2","day3","day4","day5")
days1 = c("1","2","3","4","5")
pro1 = res[res$fire_day == 1 & res$human == 1,]
pro2 = res[res$fire_day == 2 & res$human == 1,]
pro3 = res[res$fire_day == 3 & res$human == 1,]
pro4 = res[res$fire_day == 4 & res$human == 1,]
pro5 = res[res$fire_day == 5 & res$human == 1,]
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

pro1h = res[res$fire_day == 1 & res$human == 2,]
pro2h = res[res$fire_day == 2 & res$human == 2,]
pro3h = res[res$fire_day == 3 & res$human == 2,]
pro4h = res[res$fire_day == 4 & res$human == 2,]
pro5h = res[res$fire_day == 5 & res$human == 2,]
me1[1] =mean(pro1h$growth_km,na.omit=T)
me1[2] =mean(pro2h$growth_km,na.omit=T)
me1[3] =mean(pro3h$growth_km,na.omit=T)
me1[4] =mean(pro4h$growth_km,na.omit=T)
me1[5] =mean(pro5h$growth_km,na.omit=T)

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)


boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,250), cex.lab=1.4,cex.axis = 1.3)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure1_v2.pdf", width = 10, height = 5)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^2*')'),ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
text(0.3,195,"a)",pos=4, cex=1.4)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,200), cex.lab=1.4,cex.axis = 1.3)
text(0.3,195,"b)",pos=4, cex=1.4)
dev.off()
quartz_off_screen 
                3 
pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_figure1_v2.pdf", width = 10, height = 5)
par(mfrow=c(1,2))
par(mar=c(4, 4, 1,0.1))
par(mgp=c(2.3,1,0))
boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= expression('Fire size (km'^2*')'),ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
text(0.3,690,"a)",pos=4, cex=1.4)
boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("1","2","3","4","5"),xlab="Day since fire start",ylab= "",ylim=c(0,700), cex.lab=1.4,cex.axis = 1.3)
text(0.3,690,"b)",pos=4, cex=1.4)
dev.off() 
quartz_off_screen 
                3 
pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/all_v3.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n',cex.axis=1.4, lty = 1, lwd = 2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
legend(x="topleft", legend=c("human","lightning"),col="black",lty = c(1,2),pch=1,bty = "n",lwd = 2,cex=1.5, pt.cex = 1)

dev.off() 
quartz_off_screen 
                3 

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 6.5083, df = 169.36, p-value = 8.265e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.492386 2.791866
sample estimates:
 mean of x  mean of y 
 1.3226886 -0.8194377 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 6.9843, df = 134.4, p-value = 1.199e-10
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 1.369607 2.451706
sample estimates:
mean of x mean of y 
2.7559564 0.8453003 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 5.3694, df = 137.17, p-value = 3.286e-07
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9293526 2.0129234
sample estimates:
mean of x mean of y 
 3.186372  1.715234 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 4.6217, df = 122.92, p-value = 9.467e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.6909157 1.7261008
sample estimates:
mean of x mean of y 
 3.513204  2.304696 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 4.9328, df = 103.98, p-value = 3.089e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.9170094 2.1499736
sample estimates:
mean of x mean of y 
 3.895266  2.361774 

##################3 for western cordillera ecoregion ##################

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2,cex.axis=1.4)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
null device 
          1 

for mediteranean california

pro1 = res[res$fire_day == 1 & res$human == 1 & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="",cex.axis=1.4, xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

for difference in autumn

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month >8,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month >8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month >8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month >8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month >8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month >8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month >8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month >8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month >8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month >8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/autumn_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,250),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n',cex.axis=1.4, lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

for difference in summer

pro1 = res[res$fire_day == 1 & res$human == 1 & res$month <=8 ,]
pro2 = res[res$fire_day == 2 & res$human == 1 & res$month <=8,]
pro3 = res[res$fire_day == 3 & res$human == 1 & res$month <=8,]
pro4 = res[res$fire_day == 4 & res$human == 1 & res$month <=8,]
pro5 = res[res$fire_day == 5 & res$human == 1 & res$month <=8,]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & res$month <=8,]
pro2h = res[res$fire_day == 2 & res$human == 2 & res$month <=8,]
pro3h = res[res$fire_day == 3 & res$human == 2 & res$month <=8,]
pro4h = res[res$fire_day == 4 & res$human == 2 & res$month <=8,]
pro5h = res[res$fire_day == 5 & res$human == 2 & res$month <=8,]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)


par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/summer_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n',cex.axis=1.4, lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

for difference in summer in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

t.test(log(pro1$growth_km),log(pro1h$growth_km))

    Welch Two Sample t-test

data:  log(pro1$growth_km) and log(pro1h$growth_km)
t = 1.038, df = 53.703, p-value = 0.3039
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.4317907  1.3585976
sample estimates:
 mean of x  mean of y 
-0.2855046 -0.7489080 
t.test(log(pro2$growth_km),log(pro2h$growth_km))

    Welch Two Sample t-test

data:  log(pro2$growth_km) and log(pro2h$growth_km)
t = 3.6912, df = 82.447, p-value = 0.0003995
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.555548 1.854073
sample estimates:
mean of x mean of y 
 2.058908  0.854097 
t.test(log(pro3$growth_km),log(pro3h$growth_km))

    Welch Two Sample t-test

data:  log(pro3$growth_km) and log(pro3h$growth_km)
t = 2.2426, df = 64.873, p-value = 0.02835
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.07573427 1.30867147
sample estimates:
mean of x mean of y 
 2.535161  1.842958 
t.test(log(pro4$growth_km),log(pro4h$growth_km))

    Welch Two Sample t-test

data:  log(pro4$growth_km) and log(pro4h$growth_km)
t = 2.3845, df = 62.683, p-value = 0.02014
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1141261 1.2961201
sample estimates:
mean of x mean of y 
 2.976315  2.271192 
t.test(log(pro5$growth_km),log(pro5h$growth_km))

    Welch Two Sample t-test

data:  log(pro5$growth_km) and log(pro5h$growth_km)
t = 2.3428, df = 40.216, p-value = 0.02417
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1060498 1.4368888
sample estimates:
mean of x mean of y 
 3.327351  2.555881 
me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_summer_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="",cex.axis=1.4, xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

for difference in autumn in western cordillera

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro4h = res[res$fire_day == 4 & res$human == 2 & (res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 6 | res$eco1 == 7),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/north_autumn_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,250),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n',cex.axis=1.4, lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

for difference in summer in meditereanean

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month <=8 & res$month >5 ) & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

#t.test(log(pro1$growth_km),log(pro1h$growth_km))
#t.test(log(pro2$growth_km),log(pro2h$growth_km))
#t.test(log(pro3$growth_km),log(pro3h$growth_km))
#t.test(log(pro4$growth_km),log(pro4h$growth_km))
#t.test(log(pro5$growth_km),log(pro5h$growth_km))

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_summer_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n',cex.axis=1.4, lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

` ################## for difference in autumn in mediteranean ##################

pro1 = res[res$fire_day == 1 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro2 = res[res$fire_day == 2 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro3 = res[res$fire_day == 3 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro4 = res[res$fire_day == 4 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]
pro5 = res[res$fire_day == 5 & res$human == 1 & ( res$month >8 ) & (res$eco1 == 11),]

boxplot(pro1$growth_km,pro2$growth_km,pro3$growth_km,pro4$growth_km,pro5$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)


pro1h = res[res$fire_day == 1 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro2h = res[res$fire_day == 2 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro3h = res[res$fire_day == 3 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro4h = res[res$fire_day == 4 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]
pro5h = res[res$fire_day == 5 & res$human == 2 & ( res$month >8 ) & (res$eco1 == 11),]

boxplot(pro1h$growth_km,pro2h$growth_km,pro3h$growth_km,pro4h$growth_km,pro5h$growth_km,names=c("day1","day2","day3","day4","day5"),xlab="",ylab="fire size (km2)",ylim=c(0,300), cex.lab=1.4,cex.axis = 1.3)

me[1] =mean(pro1$growth_km,na.omit=T)
me[2] =mean(pro2$growth_km,na.omit=T)
me[3] =mean(pro3$growth_km,na.omit=T)
me[4] =mean(pro4$growth_km,na.omit=T)
me[5] =mean(pro5$growth_km,na.omit=T)

me1[1] =mean(pro1h$growth_km,na.rm=T)
me1[2] =mean(pro2h$growth_km,na.rm=T)
me1[3] =mean(pro3h$growth_km,na.rm=T)
me1[4] =mean(pro4h$growth_km,na.rm=T)
me1[5] =mean(pro5h$growth_km,na.rm=T)

par(mgp=c(2.3,1,0))  

plot(me,type="o", ylim=c(0,150),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days)
points(me1,type="o",lty = 2, lwd = 2)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig4/med_autumn_v2.pdf", width = 4, height = 5)
par(mgp=c(2.3,1,0))  
plot(me,type="o", ylim=c(0,400),ylab=expression("fire size (km"^2*")"),xlab="", xaxt='n', lty = 1,cex.axis=1.4, lwd = 2,cex.lab=1.2)
axis(side=1, at=c(1:5),labels=days1,cex.axis=1.4)
points(me1,type="o",lty = 2, lwd = 2)
dev.off() 
quartz_off_screen 
                3 

how many days does it take to reach 75% burnt area

res75 = res[res$per_ba > 0.75,]
#peak_day = as.data.frame(aggregate(res75$fire_day, by = list(res75$firename,res75$cause), min))
#peak_day=subset(peak_day,x < 55)
#hi = hist(peak_day$x,prob =F, breaks= c(0:54), xlim=c(0,55), ylab="number of fires", xlab="days", cex.lab=1.4,cex.axis=1.3)

out1 = subset(res75,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 )


peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))
peak=as.data.frame(aggregate(res75$fire_day, by = list(res75$firename), min))
quantile(peak_day1$x,0.50,type=3) 
50% 
 10 
quantile(peak_day2$x,0.50,type=3) 
50% 
  3 
peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,30))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/time_to_reach75.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,30))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  mediteranean  ###########
out1 = subset(res75,cause == 1 & res75$eco1 == 11)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 & res75$eco1 == 11)
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/med.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,15))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  north cal  ###########
out1 = subset(res75,cause == 1  & (res75$eco1 == 6 | res75$eco1 == 7))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14  & (res75$eco1 == 6 | res75$eco1 == 7))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/north.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,15))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  mediteranean  SUMMER ###########
out1 = subset(res75,cause == 1 & res75$eco1 == 11 & ( res75$month <=8 & res75$month >5 ))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 & res75$eco1 == 11 & ( res75$month <=8 & res75$month >5 ))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/med_summer.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,10))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  north cal  summer ###########
out1 = subset(res75,cause == 1  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month <=8 & res75$month >5 ))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month <=8 & res75$month >5 ))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/north_summer.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,12))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  mediteranean  autumn###########
out1 = subset(res75,cause == 1 & res75$eco1 == 11 & ( res75$month >8))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14 & res75$eco1 == 11 & ( res75$month >8 ))
#peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

#peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
#hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(0,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/med_autumn.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,5))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 
########  north cal  autumn ###########
out1 = subset(res75,cause == 1  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month >8))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res75,cause !=1 & cause != 14  & (res75$eco1 == 6 | res75$eco1 == 7)& ( res75$month >8 ))
peak_day1 = as.data.frame(aggregate(out1$fire_day, by = list(out1$firename), min))
peak_day2 = as.data.frame(aggregate(out2$fire_day, by = list(out2$firename), min))

peak_day1=subset(peak_day1,x < 56)
peak_day2=subset(peak_day2,x < 56)
hist.a =hist(peak_day1$x,breaks =c(0:55),plot=F)
hist.b =hist(peak_day2$x,breaks =c(0:55),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

pdf(file="/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/sup_fig5_time75/north_autumn.pdf",width=7,height=5)
fr = barplot(fg,xlab="Days after ignition",ylab="Number of fires",cex.lab=1.4,cex.axis = 1.3, xlim=c(1,65), ylim=c(0,5))
axis(1,c(0.7,5.5,11.5,17.5,23.5,29.5,35.5,41.5,47.5,53.5,59.5,65.5),labels=c(1,5,10,15,20,25,30,35,40,45,50,55),cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off()
quartz_off_screen 
                2 


res=res[res$ros_km>0,]
res_f = res[res$max_land == 1,]
res_p = res[res$max_land != 1,]

summary(lm(log(res$mean_frp)~log(res$ros_km)))

Call:
lm(formula = log(res$mean_frp) ~ log(res$ros_km))

Residuals:
    Min      1Q  Median      3Q     Max 
-2.5266 -0.5420 -0.0497  0.4990  4.5702 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)      1.74609    0.01869   93.41   <2e-16 ***
log(res$ros_km)  0.35186    0.01321   26.63   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8362 on 2249 degrees of freedom
  (547 observations deleted due to missingness)
Multiple R-squared:  0.2397,    Adjusted R-squared:  0.2394 
F-statistic: 709.1 on 1 and 2249 DF,  p-value: < 2.2e-16
#just show the plot here
plot(res_f$mean_frp~res_f$ros_km,log="xy",xlim=c(0.005,30),ylim=c(0.1,180),xaxt="n",ylab="mean FRP (MW)",xlab="Rate-of-Spread (km/day)", cex.lab=1.4,cex.axis = 1.3,col="darkgreen")

marks=c(0.01,0.1,1,10)
marks1=c(0.1,0.5,5,50)


pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/fig_FRP_ros_v3.pdf", width = 5, height = 5)
plot(res_f$mean_frp~res_f$ros_km,log="xy",xlim=c(0.005,30),ylim=c(0.1,180),xaxt="n",yaxt="n",ylab="mean FRP (MW)",xlab=expression('Rate-of-Spread (km d'^-1*')'), cex.lab=1.4,cex.axis = 1.3,col="darkgreen")
points(res_p$mean_frp~res_p$ros_km,col="orange")
axis(1,at=marks,labels=marks,cex.axis=1.4 )
axis(2,at=marks1,labels=marks1,cex.axis=1.4 )
legend( x="topleft",legend=c("Forest","Grass & shrub"),col=c("darkgreen","orange"),cex=1.2,pch=1,bty = "n")
dev.off()
quartz_off_screen 
                3 

FRP vs tree mortality

summary(lm(log(res$mean_frp)~res$mean_bas))

Call:
lm(formula = log(res$mean_frp) ~ res$mean_bas)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.3250 -0.5824  0.0428  0.5755  2.7943 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.853006   0.039957   21.35   <2e-16 ***
res$mean_bas 0.019447   0.001025   18.97   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8574 on 1727 degrees of freedom
  (1069 observations deleted due to missingness)
Multiple R-squared:  0.1725,    Adjusted R-squared:  0.172 
F-statistic: 359.9 on 1 and 1727 DF,  p-value: < 2.2e-16
summary(lm(data_forest$mean_BA_red~(log10(data_forest$ros_km)+I((log10(data_forest$ros_km))^2))))

Call:
lm(formula = data_forest$mean_BA_red ~ (log10(data_forest$ros_km) + 
    I((log10(data_forest$ros_km))^2)))

Residuals:
    Min      1Q  Median      3Q     Max 
-40.210 -11.114  -3.598   8.209  82.558 

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                       27.0251     0.5005   54.00   <2e-16 ***
log10(data_forest$ros_km)         25.2022     1.1296   22.31   <2e-16 ***
I((log10(data_forest$ros_km))^2)   8.3470     0.8597    9.71   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 16.51 on 1426 degrees of freedom
Multiple R-squared:  0.2908,    Adjusted R-squared:  0.2898 
F-statistic: 292.4 on 2 and 1426 DF,  p-value: < 2.2e-16

difference in fire size for first 5 days across california and both ecosystems

 
res$ros1 = res$max_ros+1


out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

hum1 = out2[out2$fire_day ==1,]
hum2 = out2[out2$fire_day ==2,]
hum3 = out2[out2$fire_day ==3,]
hum4 = out2[out2$fire_day ==4,]
hum5 = out2[out2$fire_day ==5,]
lig1 = out1[out1$fire_day ==1,]
lig2 = out1[out1$fire_day ==2,]
lig3 = out1[out1$fire_day ==3,]
lig4 = out1[out1$fire_day ==4,]
lig5 = out1[out1$fire_day ==5,]
mean(hum1$growth)
mean(hum2$growth)
mean(hum3$growth)
mean(hum4$growth)
mean(hum5$growth)
mean(lig1$growth)
mean(lig2$growth)
mean(lig3$growth)
mean(lig4$growth)
mean(lig5$growth)
t.test(log10(hum1$growth),log10(lig1$growth))
t.test(log10(hum2$growth),log10(lig2$growth))
t.test(log10(hum3$growth),log10(lig3$growth))
t.test(log10(hum4$growth),log10(lig4$growth))
t.test(log10(hum5$growth),log10(lig5$growth))

hum1 = out2[out2$fire_day ==1 & out2$eco1==6,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==6,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==6,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==6,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==6,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==6,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==6,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==6,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==6,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==6,]
mean(hum1$growth)
mean(hum2$growth)
mean(hum3$growth)
mean(hum4$growth)
mean(hum5$growth)
mean(lig1$growth, na.rm=T)
mean(lig2$growth, na.rm=T)
mean(lig3$growth, na.rm=T)
mean(lig4$growth, na.rm=T)
mean(lig5$growth, na.rm=T)
t.test(log10(hum1$growth),log10(lig1$growth))
t.test(log10(hum2$growth),log10(lig2$growth))
t.test(log10(hum3$growth),log10(lig3$growth))
t.test(log10(hum4$growth),log10(lig4$growth))
t.test(log10(hum5$growth),log10(lig5$growth))

hum1 = out2[out2$fire_day ==1 & out2$eco1==11,]
hum2 = out2[out2$fire_day ==2 & out2$eco1==11,]
hum3 = out2[out2$fire_day ==3 & out2$eco1==11,]
hum4 = out2[out2$fire_day ==4 & out2$eco1==11,]
hum5 = out2[out2$fire_day ==5 & out2$eco1==11,]
lig1 = out1[out1$fire_day ==1 & out1$eco1==11,]
lig2 = out1[out1$fire_day ==2 & out1$eco1==11,]
lig3 = out1[out1$fire_day ==3 & out1$eco1==11,]
lig4 = out1[out1$fire_day ==4 & out1$eco1==11,]
lig5 = out1[out1$fire_day ==5 & out1$eco1==11,]
mean(hum1$growth)
mean(hum2$growth)
mean(hum3$growth)
mean(hum4$growth)
mean(hum5$growth)
mean(lig1$growth, na.rm=T)
mean(lig2$growth, na.rm=T)
mean(lig3$growth, na.rm=T)
mean(lig4$growth, na.rm=T)
mean(lig5$growth, na.rm=T)
#t.test(log10(hum1$growth),log10(lig1$growth))
#t.test(log10(hum2$growth),log10(lig2$growth))
t.test(log10(hum3$growth),log10(lig3$growth))
t.test(log10(hum4$growth),log10(lig4$growth))
t.test(log10(hum5$growth),log10(lig5$growth))

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

mean(out1$ros_km,na.rm=T)
[1] 0.8405408
mean(out2$ros_km,na.rm=T)
[1] 1.82709
hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


out1 = subset(res,cause == 1 & eco1 == 11)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11)

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ autumn northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ autumn mediterean california
out1 = subset(res,cause == 1 & eco1 == 11 & (month > 9))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11 & (month > 9))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ summer northern california
out1 = subset(res,cause == 1 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & (eco1 == 6 | eco1 == 7) & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


############ summer mediterean california
out1 = subset(res,cause == 1 & eco1 == 11  & (month > 5 & month<10))   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 & eco1 == 11  & (month > 5 & month<10))

hist.a =hist(out1$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.01,0.05,0.1,0.25,0.5,1,2,5,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5,30.5,33.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )


mean(out1$ros_km,na.rm=T)
[1] 0.8405408
mean(out2$ros_km,na.rm=T)
[1] 1.82709
#0,0.25,0.5,1,2,3,5,7,10,20,30
hist.a =hist(out1$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
hist.b =hist(out2$ros_km,breaks =c(0,0.5,1,2,3,5,7,10,20,30),plot=F)
fg = rbind(hist.a$counts,hist.b$counts)
dens = rbind((hist.a$counts/(sum(hist.a$counts)))*100,(hist.b$counts/(sum(hist.b$counts)))*100)

fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab="Number of fire days",cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="% fire days",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/figure2_freq_v1.pdf", width = 6, height = 5)
fr = barplot(dens, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab="Fire days (%)",ylim=c(0,60),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                3 

###burnt area by rate-of-spread


data_test = data_s1[data_s1$max_land == 1,]
data_test1 = data_s1[data_s1$L1CODE == 6 |data_s1$L1CODE == 7 ,]
data_test2 = data_s1[data_s1$L1CODE == 11,]

data_test1 = data_s1[data_s1$human == 1 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]
data_test2 = data_s1[data_s1$human == 2 & (data_s1$L1CODE == 6 |data_s1$L1CODE == 7),]

data_test1 = data_s1[data_s1$human == 1 ,]
data_test2 = data_s1[data_s1$human == 2 ,]

fast = data_test1[data_test1$ros_km > 3.64,]
sum(fast$size,na.rm=T)/sum(data_test1$size,na.rm=T)
[1] 0.4992649
sum((data_test1$size*data_test1$ros_km),na.rm=T)/sum(data_test1$size,na.rm=T)
[1] 5.610449
fast = data_test2[data_test2$ros_km > 2.2,]
sum(fast$size,na.rm=T)/sum(data_test2$size,na.rm=T)
[1] 0.499989
sum((data_test2$size*data_test2$ros_km),na.rm=T)/sum(data_test2$size,na.rm=T)
[1] 3.532566
fast = data_s1[data_s1$ros_km > 1,]
fast_hum = fast[fast$human == 1,]

print("% BA and % of fire days fast fires > 1km/day")
[1] "% BA and % of fire days fast fires > 1km/day"
sum(fast$size)/sum(data_s1$size)
[1] 0.8359887
length(fast$size)/length(data_s1$size)
[1] 0.3371951
print("% BA  fast fires due to human ignition % of fire days human caused fast fires > 1km/day")
[1] "% BA  fast fires due to human ignition % of fire days human caused fast fires > 1km/day"
sum(fast_hum$size, na.rm=T)/sum(fast$size)
[1] 0.4634998
length(fast_hum$size)/length(fast$size)
[1] 0.4195298
all_min1 = data_s1[data_s1$nr_day != 1,] # remove first fire spread day from statistics

quan = quantile(data_s1$ros_km,0.9)
fast = data_s1[data_s1$ros_km > quan,]
slow = data_s1[data_s1$ros_km < quan,]
fast_hum = fast[fast$human == 1,]

print("fastest 10% fires cause xxx% of BA")
[1] "fastest 10% fires cause xxx% of BA"
sum(fast$size)/sum(all_min1$size)
[1] 0.5493523
length(fast$size)/length(all_min1$size)
[1] 0.1
print("mean tree mortality weighted by BA and just mean")
[1] "mean tree mortality weighted by BA and just mean"
sum((data_s1$mean_BA_red*data_s1$size))/(sum(data_s1$size))
[1] 49.03327
mean(data_s1$mean_BA_red)
[1] 25.64874
print("% BA due to human fires amoung fastest 10% fire days")
[1] "% BA due to human fires amoung fastest 10% fire days"
sum(fast_hum$size, na.rm=T)/sum(fast$size)
[1] 0.5143879
print("% fire number due to human fires amoung fastest 10% fire days")
[1] "% fire number due to human fires amoung fastest 10% fire days"
length(fast_hum$size)/length(fast$size)
[1] 0.5060976
print("% tree mortality fast fires weighthed and not")
[1] "% tree mortality fast fires weighthed and not"
sum((fast$mean_BA_red*fast$size))/(sum(fast$size))
[1] 60.02651
mean(fast$mean_BA_red)
[1] 52.79125
print("% tree mortality slow fires weighthed and not")
[1] "% tree mortality slow fires weighthed and not"
sum((slow$mean_BA_red*slow$size))/(sum(slow$size))
[1] 35.63221
mean(slow$mean_BA_red)
[1] 22.63291
print("tree mortality <0.5km and >2km")
[1] "tree mortality <0.5km and >2km"
fast1 = data_s1[data_s1$ros_km > 2,]
slow1 = data_s1[data_s1$ros_km < 0.5,]
mean(fast1$mean_BA_red,omit.na=T )
[1] 48.30526
mean(slow1$mean_BA_red,omit.na=T )
[1] 15.29343
# plot BA per rate of spread 
out1 = subset(data_s1,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(data_s1,cause !=1 & cause != 14 )

breaks =c(0,0.5,1,2,3,5,7,10,20,30)

tt=0
pp=0
for (i in 1:9){

  kr = out1[out1$ros_km >= breaks[i] & out1$ros_km < breaks[i+1],]
  kp = out2[out2$ros_km >= breaks[i] & out2$ros_km < breaks[i+1],]

tt[i]=sum(kr$size, na.rm=T)/1000000
pp[i]= sum(kp$size, na.rm=T)/1000000
}
sum(tt)
[1] 6781.34
sum(pp)
[1] 5612.935
fg = rbind(tt,pp)

par(mar=c(4, 5, 2,0.1))
fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab=expression('burnt area (km'^2*')'),ylim=c(0,2000),cex.lab=1.4,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels= breaks ,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")


tiff("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/BA_per_ros_hist.tif", width = 6, height = 5, units = 'in', res = 300)
par(mar=c(4, 5, 2,0.1))
fr = barplot(fg, beside=TRUE,xlab="Rate-of-Spread (km/day)",ylab=expression('burnt area (km'^2*')'),ylim=c(0,2000),cex.lab=1.4,cex.axis = 1.3)
#axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels= breaks ,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                3 
fg1=rbind((tt/sum(tt))*100,(pp/sum(pp))*100)

pdf("/Users/stijnhantson/Documents/Documents/articulos/en_proceso/VIIRS_ros/BA_per_ros_hist_percentage.pdf", width = 6, height = 5)
#par(mar=c(1, 1, 1,1))
fr = barplot(fg1, beside=TRUE,xlab=expression('Rate-of-Spread (km d'^-1*')'),ylab= "Burned area (%)",ylim=c(0,30),cex.lab=1.4,cex.axis = 1.3)
#axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels=hist.a$breaks,cex.axis = 1.3)
axis(1,at=c(0.5,3.5,6.5,9.5,12.5,15.5,18.5,21.5,24.5,27.5),labels= breaks ,cex.axis = 1.3)
legend("topright",legend = c("human","lightning"), fill=c("grey","black"),cex=1.4,bty = "n")
dev.off() 
quartz_off_screen 
                3 

20 fastest fires


res1 = res[res$ros_km > 10 & !is.na(res$ros_km),]
Error in res$ros_km : object of type 'closure' is not subsettable

are ROS the same for light & human under the same conditions

out1 = subset(res,cause == 1 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,cause !=1 & cause != 14 )

plot(out1$vpd,log(out1$ros_km))
points(out2$vpd,log(out2$ros_km),col="red")

summary(lm(out1$vpd~log(out1$ros_km+1),na.omit=T))
summary(lm(out2$vpd~log(out2$ros_km+1)))

analysis of the first day

load data


daily_res=read.table("/Users/stijnhantson/Documents/projects/VIIRS_ros/all_ignitions_V3.txt",header=T)

res=as.data.frame(daily_res)

res$bi =as.numeric(as.character(res$bi))
res$erc =as.numeric(as.character(res$erc))
res$etr =as.numeric(as.character(res$etr))
res$fm100 =as.numeric(as.character(res$fm100))
res$fm1000 =as.numeric(as.character(res$fm1000))
res$pet =as.numeric(as.character(res$pet))
res$pr =as.numeric(as.character(res$pr))
res$rmax =as.numeric(as.character(res$rmax))
res$rmin =as.numeric(as.character(res$rmin))
res$th =as.numeric(as.character(res$th))
res$tmmn =as.numeric(as.character(res$tmmn))
res$tmmx =as.numeric(as.character(res$tmmx))
res$vpd =as.numeric(as.character(res$vpd))
res$ws =as.numeric(as.character(res$ws))
res$vs =as.numeric(as.character(res$vs))
res$total_area =as.numeric(as.character(res$total_area))
res$max_land =as.numeric(as.character(res$max_land))
res$mean_land =as.numeric(as.character(res$mean_land))

res$biomass =as.numeric(as.character(res$biomass))

res = res[-1,]
res$human[res$cause ==1] =1
res$human[res$cause !=1 & res$cause !=14] =0

analysis


out1 = res[res$cause !=1 & res$cause != 14,] 
out2 = res[res$cause ==1,] 
length(out1$bi)
[1] 1196
length(out2$bi)
[1] 486
out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14)   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1)   #1=lightning; 14=unknown; 7=arson
length(out1$bi)
[1] 335
length(out2$bi)
[1] 375
out1 = subset(res,eco1 == 11& res$cause !=1 & res$cause != 14)
out2 = subset(res,eco1 == 11 & res$cause ==1)
length(out1$bi)
[1] 784
length(out2$bi)
[1] 45
out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14 & res$mont > 5 & res$mont < 10 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1& res$mont > 5 & res$mont < 10)   #1=lightning; 14=unknown; 7=arson
length(out1$bi)
[1] 248
length(out2$bi)
[1] 352
out1 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause !=1 & res$cause != 14 & res$mont < 6 & res$mont > 9 )   #1=lightning; 14=unknown; 7=arson
out2 = subset(res,(eco1 == 6 |eco1 == 7) & res$cause ==1& res$mont < 6 & res$mont > 9)   #1=lightning; 14=unknown; 7=arson

length(out1$bi)
[1] 0
length(out2$bi)
[1] 0
t.test(out1$bi,out2$bi)
Error in t.test.default(out1$bi, out2$bi) : not enough 'x' observations

analysis of MTBS temporal trend

library(raster)
library(rgeos)
mtbs_dir="/Users/stijnhantson/Documents/data/MTBS/DATA/"
med=shapefile("/Users/stijnhantson/Documents/data/veg_california/med_cal.shp")
north=shapefile("/Users/stijnhantson/Documents/data/veg_california/north_cal.shp")

year=1984
k=0
dnbr_all_med=0
rdnbr_all_med=0
dnbr_all_nor=0
rdnbr_all_nor=0

len_dnbr_med=0
len_rdnbr_med=0
len_dnbr_nor=0
len_rdnbr_nor=0
for (year in 1984:2017){
  print(year)
  k=k+1
mtbs_dir_year = paste(mtbs_dir,year,"/",sep="")
bndy_list = list.files(mtbs_dir_year, pattern = "burn_bndy.shp$", recursive = T, full.names=T)
shapefile_list <- lapply(bndy_list, shapefile)
fires <- do.call(rbind, shapefile_list)
fires=gUnaryUnion(fires)
fire_north = intersect(fires,north)
fire_med = intersect(fires,med)

dnbr = raster(paste(mtbs_dir,year,"_dnbr.tif",sep=""))
  dnbr[dnbr < -2000] <- NA
  rdnbr = dnbr = raster(paste(mtbs_dir,year,"_rdnbr.tif",sep=""))
  rdnbr[rdnbr < -2000] <- NA
  
dnbr_ext_med = extract(dnbr,fire_med)
dnbr_ext_nor = extract(dnbr,fire_north)

rdnbr_ext_med = extract(rdnbr,fire_med)
rdnbr_ext_nor = extract(rdnbr,fire_north)

dnbr_all_med[k]=mean(unlist(dnbr_ext_med),na.rm=T)
rdnbr_all_med[k]=mean(unlist(rdnbr_ext_med),na.rm=T)
dnbr_all_nor[k]=mean(unlist(dnbr_ext_nor),na.rm=T)
rdnbr_all_nor[k]=mean(unlist(rdnbr_ext_nor),na.rm=T)

len_dnbr_med[k] = length(unlist(dnbr_ext_med))
len_rdnbr_med[k] = length(unlist(rdnbr_ext_med))
len_dnbr_nor[k] = length(unlist(dnbr_ext_nor))
len_rdnbr_nor[k] = length(unlist(rdnbr_ext_nor))
removeTmpFiles(0)
gc()
}

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

```

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgoKQWRkIGEgbmV3IGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqSW5zZXJ0IENodW5rKiBidXR0b24gb24gdGhlIHRvb2xiYXIgb3IgYnkgcHJlc3NpbmcgKkNtZCtPcHRpb24rSSouCgoKCgpgYGB7cn0KbGlicmFyeShyYXN0ZXIpCnNpemVfZGF0PXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9maXJlX2dyb3d0aF81ZGF5c192NC50eHQiLCBoZWFkZXI9VCwgcm93Lm5hbWVzPU5VTEwpCgpzaXplX2RhdD1hcy5kYXRhLmZyYW1lKHNpemVfZGF0KQpzaXplX2RhdD1zaXplX2RhdFstMSxdCnNpemVfZGF0PXNpemVfZGF0WywtMV0KY29sbmFtZXMoc2l6ZV9kYXQpPWMoImZpcmVuYW1lIiwieWVhciIsImNhdXNlIiwic2l6ZTEiLCJzaXplMiIsInNpemUzIiwic2l6ZTQiLCJzaXplNSIsImZpbmFsX2ZpcmVzaXplIiwibWVhbl9wcmVjaXAxIiwibWVhbl9wcmVjaXAyIiwibWVhbl9wcmVjaXAzIiwibWVhbl9wcmVjaXA0IiwibWVhbl9wcmVjaXA1IiwibWVhbl90bWF4MSIsIm1lYW5fdG1heDIiLCJtZWFuX3RtYXgzIiwibWVhbl90bWF4NCIsIm1lYW5fdG1heDUiLCJtZWFuX3RtZWFuMSIsIm1lYW5fdG1lYW4yIiwibWVhbl90bWVhbjMiLCJtZWFuX3RtZWFuNCIsIm1lYW5fdG1lYW41IiwibWVhbl92cGRtYXgxIiwibWVhbl92cGRtYXgyIiwibWVhbl92cGRtYXgzIiwibWVhbl92cGRtYXg0IiwibWVhbl92cGRtYXg1IiwibWVhbl93aW5kc3BlZWQxIiwibWVhbl93aW5kc3BlZWQyIiwibWVhbl93aW5kc3BlZWQzIiwibWVhbl93aW5kc3BlZWQ0IiwibWVhbl93aW5kc3BlZWQ1IiwibGFuZGNvdmVyIiwiZWNvc3lzdGVtIiwiYmlvbWFzcyIsImVsZXZhdGlvbiIpCgpzaXplX2RhdDIgPC0gZGF0YS5mcmFtZShsYXBwbHkoc2l6ZV9kYXQsIGZ1bmN0aW9uKHgpIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHgpKSkpCnNpemVfZGF0MiRodW1hbiA9IDAKc2l6ZV9kYXQyJGh1bWFuW3NpemVfZGF0MiRjYXVzZSAhPTEgJiBzaXplX2RhdDIkY2F1c2UgIT0xNCAmIHNpemVfZGF0MiRjYXVzZSAhPTE3XT0xCnNpemVfZGF0MiRodW1hbltzaXplX2RhdDIkY2F1c2UgPT0xIF09MgoKcHJvMSA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KcHJvMiA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGxhbmRjb3ZlciA9PSAxICksIF0KCnQudGVzdChwcm8xJHNpemUxLHBybzIkc2l6ZTEpCnQudGVzdChwcm8xJHNpemUyLHBybzIkc2l6ZTIpCnQudGVzdChwcm8xJHNpemUzLHBybzIkc2l6ZTMpCnQudGVzdChwcm8xJHNpemU0LHBybzIkc2l6ZTQpCnQudGVzdChwcm8xJHNpemU1LHBybzIkc2l6ZTUpCgoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDEpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDEgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvID1zaXplX2RhdDJbd2hpY2goc2l6ZV9kYXQyJGh1bWFuID09IDIgJiBzaXplX2RhdDIkbGFuZGNvdmVyID09IDIpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpsZW5ndGgoIWlzLm5hKHBybyRzaXplNSkpCgoKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAxICYgc2l6ZV9kYXQyJGVjb3N5c3RlbSA9PSA2KSwgXQpsZW5ndGgocHJvJHllYXIpCmJveHBsb3QocHJvJHNpemUxLHBybyRzaXplMixwcm8kc2l6ZTMscHJvJHNpemU0LHBybyRzaXplNSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCw1MDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybyA9c2l6ZV9kYXQyW3doaWNoKHNpemVfZGF0MiRodW1hbiA9PSAyJiBzaXplX2RhdDIkZWNvc3lzdGVtID09IDYpLCBdCmxlbmd0aChwcm8keWVhcikKYm94cGxvdChwcm8kc2l6ZTEscHJvJHNpemUyLHBybyRzaXplMyxwcm8kc2l6ZTQscHJvJHNpemU1LG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDUwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKCmBgYAoKCgoKCiMjIyMjIyMjIyMjIyBwbG90IGZpcmUgc2l6ZSBtYXAgUUdJUyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KbGlicmFyeShkYXRhLnRhYmxlKQpEVD0gZGF0YS50YWJsZShyZXMpCmZpcmVfc2l6ZSA9IERUWyAsIC5TRFt3aGljaC5taW4oZ3Jvd3RoX2ttKV0sIGJ5ID0gZmlyZW5hbWVdCgpmaXJlX3NpemUgPSBmaXJlX3NpemVbLGMoKV0Kc3ByZWFkX2xpc3QgPWxpc3QuZmlsZXModmlpcnNfZGlyLCBwYXR0ZXJuID0gIl9kYWlseS5zaHAkIiwgcmVjdXJzaXZlID0gVFJVRSwgZnVsbC5uYW1lcz1UKQppPTEKIGw9c2hhcGVmaWxlKHNwcmVhZF9saXN0W2ldKQpmb3IgKGkgaW4gMjpsZW5ndGgoc3ByZWFkX2xpc3QpKXsKICBwPXNoYXBlZmlsZShzcHJlYWRfbGlzdFtpXSkKICBsIDwtIHJiaW5kKGwsIHAsIG1ha2VVbmlxdWVJRHMgPSBUUlVFKSAKfQogbCRodW1hbiA9IDAKbCRodW1hbltsJENBVVNFICE9MSAmIGwkQ0FVU0UgIT0xNCAmIGwkQ0FVU0UgIT0xN109MQpsJGh1bWFuW2wkQ0FVU0UgPT0xIF09MgoKICAgICB3cml0ZU9HUihsLCAiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zLyIsIGxheWVyPSAiYWxsX2ZpcmVzIiwgZHJpdmVyPSJFU1JJIFNoYXBlZmlsZSIsIG92ZXJ3cml0ZV9sYXllciA9IFQpCgpgYGAKCgoKCgojIyMjIyBleHRyYWN0IG51bWJlciBhbmQgc2l6ZSBzdGF0aXN0aWNzIGZyb20gZnJhcCAgICMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQoKZHIgPXNoYXBlZmlsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2ZyYXBfc3Vic2V0LnNocCIpCmRyMSA9c2hhcGVmaWxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL0ZSQVAvZmlyZTE4XzEuc2hwIikKZHIxJFlFQVJfPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRZRUFSXykpCmRyMSRTaGFwZV9BcmVhPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRyMSRTaGFwZV9BcmVhKSkKZHIxPWRyMVshaXMubmEoZHIxJFlFQVJfKSwgXQpkcjE9ZHIxW2RyMSRZRUFSXz4yMDExLF0KCnN1bShkciRTaGFwZV9BcmVhKS9zdW0oZHIxJFNoYXBlX0FyZWEpCnN1bShuYS5vbWl0KGRyJEdJU19BQ1JFUykpL3N1bShuYS5vbWl0KGRyMSRHSVNfQUNSRVMpKQoKCmRyJHNxa20gPSBkciRHSVNfQUNSRVMgKiAwLjAwNDA0Njg1NjQyMjQKbWF4KGRyJHNxa20pCmRyX2ggPSBkcltkciRDQVVTRSAhPTEgJiBkciRDQVVTRSAhPTE0LF0KZHJfbCA9IGRyW2RyJENBVVNFID09IDEsXQpkcl9vID0gZHJbZHIkQ0FVU0UgPT0gMTQsXQoKcHJpbnQoIm1lYW4gZmlyZSBzaXplIGZvciBodW1hbiBhbmQgbGlnaHRuaW5nIGZpcmVzIikKbWVhbihkcl9oJEdJU19BQ1JFUykqIDAuMDA0MDQ2ODU2NDIyNAptZWFuKGRyX2wkR0lTX0FDUkVTKSogMC4wMDQwNDY4NTY0MjI0CgpxdWFudGlsZShkcl9oJEdJU19BQ1JFUykqIDAuMDA0MDQ2ODU2NDIyNApxdWFudGlsZShkcl9sJEdJU19BQ1JFUykqIDAuMDA0MDQ2ODU2NDIyNAoKc3VtKGRyX2gkR0lTX0FDUkVTKSogMC4wMDQwNDY4NTY0MjI0CnN1bShkcl9sJEdJU19BQ1JFUykqIDAuMDA0MDQ2ODU2NDIyNApzdW0oZHJfbyRHSVNfQUNSRVMpKiAwLjAwNDA0Njg1NjQyMjQKc3VtKGRyJEdJU19BQ1JFUykqIDAuMDA0MDQ2ODU2NDIyNAoKaGlzdC5hID1oaXN0KGRyJHNxa20sYnJlYWtzID1jKDAsMTAsMjUsNTAsMTAwLDI1MCwxMDAwLDIwMDApLHBsb3Q9RikKCmZyID0gYmFycGxvdChoaXN0LmEkY291bnRzLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ0ZpcmUgc2l6ZSAoa20nXjIqJyknKSx5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjEsMS4zLDIuNSwzLjcsNC45LDYuMSw3LjMsOC41KSxsYWJlbHM9YygwLDEwLDI1LDUwLDEwMCwyNTAsMTAwMCwyMDAwKSxjZXguYXhpcyA9IDEuMykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2FsbF9maXJlc2l6ZS5wZGYiLHdpZHRoPTcsaGVpZ2h0PTYpCmZyID0gYmFycGxvdChoaXN0LmEkY291bnRzLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ0ZpcmUgc2l6ZSAoa20nXjIqJyknKSx5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLHlsaW09YygwLDUwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC4xLDEuMywyLjUsMy43LDQuOSw2LjEsNy4zLDguNSksbGFiZWxzPWMoMCwxMCwyNSw1MCwxMDAsMjUwLDEwMDAsMjAwMCksY2V4LmF4aXMgPSAxLjMpCmRldi5vZmYoKQoKaGlzdC5hID1oaXN0KGRyX2gkc3FrbSxicmVha3MgPWMoMCwxMCwyNSw1MCwxMDAsMjUwLDEwMDAsMjAwMCkscGxvdD1GKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvaHVtYW5fZmlyZXNpemUucGRmIix3aWR0aD03LGhlaWdodD02KQpmciA9IGJhcnBsb3QoaGlzdC5hJGNvdW50cywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdGaXJlIHNpemUgKGttJ14yKicpJykseWxhYj0iTnVtYmVyIG9mIGZpcmVzIix5bGltPWMoMCw1MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuMSwxLjMsMi41LDMuNyw0LjksNi4xLDcuMyw4LjUpLGxhYmVscz1jKDAsMTAsMjUsNTAsMTAwLDI1MCwxMDAwLDIwMDApLGNleC5heGlzID0gMS4zKQpkZXYub2ZmKCkKCmhpc3QuYSA9aGlzdChkcl9sJHNxa20sYnJlYWtzID1jKDAsMTAsMjUsNTAsMTAwLDI1MCwxMDAwLDIwMDApLHBsb3Q9RikKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2xpZ2h0bmluZ19maXJlc2l6ZS5wZGYiLHdpZHRoPTcsaGVpZ2h0PTYpCmZyID0gYmFycGxvdChoaXN0LmEkY291bnRzLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ0ZpcmUgc2l6ZSAoa20nXjIqJyknKSx5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLCB5bGltPWMoMCw1MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuMSwxLjMsMi41LDMuNyw0LjksNi4xLDcuMyw4LjUpLGxhYmVscz1jKDAsMTAsMjUsNTAsMTAwLDI1MCwxMDAwLDIwMDApLGNleC5heGlzID0gMS4zKQpkZXYub2ZmKCkKCmBgYAoKCgpgYGB7cn0KbGlicmFyeShyYXN0ZXIpCgpkcjEgPXNoYXBlZmlsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvZGF0YS9GUkFQL2ZpcmUxOF8xLnNocCIpCmRyMSRZRUFSXz1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkcjEkWUVBUl8pKQpkcjEkU2hhcGVfQXJlYT1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkcjEkU2hhcGVfQXJlYSkpCmRyMSRBTEFSTV9EQVRFID0gYXMuRGF0ZShkcjEkQUxBUk1fREFURSApCmRyMT1kcjFbIWlzLm5hKGRyMSRZRUFSXyksIF0KZHIxPWRyMVtkcjEkWUVBUl8+MjAxMSxdCgoKZHIyPWRyMVtkcjEkWUVBUl8gPT0gMjAxMyxdCnBsb3QodGFibGUoZHIyJEFMQVJNX0RBVEUpLCB4bGltPWMoYXMuRGF0ZSgiMjAxMy8wMS8wMSIpLGFzLkRhdGUoIjIwMTMvMTIvMzEiKSkpCnRhYmxlKGZhY3RvcihkcjIkQUxBUk1fREFURSwgbGV2ZWxzID0gYXMuRGF0ZSgiMjAxMy8wMS8wMSIpOmFzLkRhdGUoIjIwMTMvMTIvMzEiKSkpCgpgYGAKCiMjIyMjIyMjIyMjIGh1bWFuIGxpZ2h0bmluZyB1bmtub3duIHJhdGlvIHRocm91Z2ggdGltZSAjIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQoKCmxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KHJnZGFsKQpsaWJyYXJ5KHJnZW9zKQpsaWJyYXJ5KHNmKQpmcmFwPXJlYWRPR1IoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL2RhdGEvRlJBUC9maXJlMTlfMS5zaHAiKQoKc2hhcGUgPSBzaGFwZWZpbGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL2RhdGEvdmVnX2NhbGlmb3JuaWEvY2FfZWNvX2wzL2NhX2Vjb19sMy5zaHAiKQpzaGFwZSA9IHNwVHJhbnNmb3JtKHNoYXBlLGNycyhmcmFwKSkKCgpmcmFwID0gc3RfbWFrZV92YWxpZChzdF9yZWFkKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL0ZSQVAvZmlyZTE5XzEuc2hwIikpCnR5cGVzIDwtIHZhcHBseShzZjo6c3RfZ2VvbWV0cnkoZnJhcCksIGZ1bmN0aW9uKHgpIHsKICBjbGFzcyh4KVsyXQp9LCAiIikKcG9seXMgPC0gZnJhcFsgZ3JlcGwoIipQT0xZR09OIiwgdHlwZXMpLCBdCgpmcmFwPXNmOjo6YXNfU3BhdGlhbChwb2x5cykKZnJhcD1nQnVmZmVyKGZyYXAsIGJ5aWQ9VCwgIHdpZHRoPTAuMCkKZWNvX2ludGVyPWludGVyc2VjdChmcmFwLHNoYXBlKQoKZnJhcCRZRUFSXyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZnJhcCRZRUFSXykpCgojIGZyYXAyMDEyID0gc3Vic2V0KGZyYXAsWUVBUl8gPjIwMTEpCiMgIGZyYXAyMDEyID0gc3Vic2V0KGZyYXAyMDEyLEdJU19BQ1JFUyA+NTAwMDApCiNsZW5ndGgoZnJhcDIwMTIpCiMgZnJhcDIwMTIkRklSRV9OQU1FCm5vcnRoID0gZWNvX2ludGVyW2Vjb19pbnRlciROQV9MMUNPREU9PSA2IHwgZWNvX2ludGVyJE5BX0wxQ09ERSA9PSA3LCBdCnNvdXRoPSBlY29faW50ZXJbZWNvX2ludGVyJE5BX0wxQ09ERT09IDExLCBdCgpmcmFwPW5vcnRoCmZyYXAkR0lTX0FDUkVTID0gZnJhcCRHSVNfQUNSRVMqMC4wMDQwNDY4NTY0MgpmcmFwX2ggPSBzdWJzZXQoZnJhcCwgQ0FVU0UgIT0gMTQgJiBDQVVTRSAhPSAxKQpmcmFwX2wgPSBzdWJzZXQoZnJhcCwgQ0FVU0UgPT0gMSkKZnJhcF91ID0gc3Vic2V0KGZyYXAsIENBVVNFID09IDE0ICkKCmh1bT0wCmxpZz0wCnVuaz0wCnByPTAKZm9yIChwYSBpbiAxOTgwOjIwMTkpewogIHByPXByKzEKICBmcmFwX2gxID0gc3Vic2V0KGZyYXBfaCxZRUFSXyA9PSBwYSkKICBmcmFwX2wxID0gc3Vic2V0KGZyYXBfbCxZRUFSXyA9PSBwYSkKICBmcmFwX3UxID0gc3Vic2V0KGZyYXBfdSxZRUFSXyA9PSBwYSkKICAKICBodW1bcHJdID0gc3VtKGZyYXBfaDEkR0lTX0FDUkVTLG5hLnJtPVQpCiAgbGlnW3ByXSA9ICBzdW0oZnJhcF9sMSRHSVNfQUNSRVMsbmEucm09VCkKICB1bmtbcHJdID0gc3VtKGZyYXBfdTEkR0lTX0FDUkVTLG5hLnJtPVQpCiAgCn0KCmh1bTU9MApsaWc1PTAKdW5rNT0wCmVuZDE9MAprPTEKZm9yIChrIGluIDE6OCl7CiAgc3QgPSBrKjUtNAogIGVuZDEgPSBrKjUKICBodW01W2tdID0gc3VtKGh1bVtzdDplbmQxXSkKICBsaWc1W2tdID0gc3VtKGxpZ1tzdDplbmQxXSkgIAogIHVuazVba10gPSBzdW0odW5rW3N0OmVuZDFdKQp9Cgp1bms1WzhdID0gdW5rNVs4XSoxLjIKaHVtNVs4XSA9IGh1bTVbOF0qMS4yCmxpZzVbOF0gPSBsaWc1WzhdKjEuMgoKdHIgPC0gcGxvdChsaWc1LCB0eXBlID0gIm8iLCBjb2w9Im9yYW5nZSIseWxpbT1jKDAsNjAwMCksIHlsYWI9IkJ1cm50IGFyZWEgKGttMi95cikiLCB4YXh0PSduJywgeGxhYj0iWWVhcnMiKQpsaW5lcyhodW01LCB0eXBlID0gIm8iLGNvbCA9ICJyZWQiKQpsaW5lcyh1bms1LCB0eXBlID0gIm8iLGNvbCA9ICJsaWdodGdyZXkiKQpheGlzKDEsIGF0PWMoMSwyLDMsNCw1LDYsNyw4KSxsYWJlbHM9YygiODAtODQiLCI4NS04OSIsIjkwLTk0IiwiOTUtOTkiLCIwMC0wNCIsIjA1LTA5IiwiMTAtMTQiLCIxNS0xOSIpKQpsZWdlbmQoeD0idG9wbGVmdCIsIGxlZ2VuZD1jKCJodW1hbiIsImxpZ2h0bmluZyIsInVua25vd24iKSxjb2w9YygicmVkIiwib3JhbmdlIiwibGlnaHRncmV5IiksbHR5ID0gMSxjZXg9MS4yLHBjaD0xLGJ0eSA9ICJuIikKCgpwbG90KGMoMTk4MDoyMDE5KSxodW0seWxpbT1jKDAsMTAwMDAwMCksdHlwZT0ibCIpCmxpbmVzKGMoMTk4MDoyMDE5KSxsaWcsY29sPSJncmVlbiIpCmxpbmVzKGMoMTk4MDoyMDE5KSx1bmssY29sPSJyZWQiKQoKaHVtX2ZyYWM9KGxpZykvKGh1bStsaWcrdW5rKQpwbG90KGh1bV9mcmFjKQoKCmBgYAoKCgoKMSkgZnJhcCAKMikgb25seSBmaXJlIGdyb3d0aCBkYXRhc2V0cwoKLSBwcmVwYXJlIGZpbmFsIGRhdGFzZXQgdG8gb3BlbgpgYGB7cn0KCmxpYnJhcnkocmFzdGVyKQojbGlicmFyeShyZ2RhbCkKZGFpbHlfcmVzPXJlYWQudGFibGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL3Byb2plY3RzL1ZJSVJTX3Jvcy9maW5hbF9kYXRhc2V0X1Y1LnR4dCIsaGVhZGVyPVQpCgpyZXM9YXMuZGF0YS5mcmFtZShkYWlseV9yZXMpCgpyZXMkbWVhbl9yb3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWFuX3JvcykpCnJlcyRtYXhfcm9zID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWF4X3JvcykpCnJlcyRtZWRpYW45NV9yb3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWRpYW45NV9yb3MpKQpyZXMkYmkgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRiaSkpCnJlcyRlcmMgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRlcmMpKQpyZXMkZXRyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZXRyKSkKcmVzJGZtMTAwID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZm0xMDApKQpyZXMkZm0xMDAwID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZm0xMDAwKSkKcmVzJHBldCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHBldCkpCnJlcyRwciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHByKSkKcmVzJHJtYXggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRybWF4KSkKcmVzJHJtaW4gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRybWluKSkKcmVzJHRoID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdGgpKQpyZXMkdG1tbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRtbW4pKQpyZXMkdG1teCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHRtbXgpKQpyZXMkdnBkID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdnBkKSkKI3JlcyR3cyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHdzKSkKcmVzJHZzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdnMpKQpyZXMkZ3Jvd3RoID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZ3Jvd3RoKSkKcmVzJHRvdGFsX2FyZWEgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0b3RhbF9hcmVhKSkKcmVzJG1lYW5fZnJwID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9mcnApKQpyZXMkZnJwXzk1ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkZnJwXzk1KSkKcmVzJG1heF9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWF4X2xhbmQpKQpyZXMkbWVhbl9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9sYW5kKSkKcmVzJGJpb21hc3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRiaW9tYXNzKSkKcmVzJHllYXIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR5ZWFyKSkKcmVzJG1vbnRoID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbW9udGgpKQpyZXMkZG95X291dCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGRveV9vdXQpKQoKcmVzJG1lYW5fZG5iciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lYW5fZG5icikpCnJlcyRtZWFuX3JkbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9yZG5icikpCnJlcyRtZWFuX2JhcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJG1lYW5fYmFzKSkKcmVzJG1lZGlhbl9kbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVkaWFuX2RuYnIpKQpyZXMkbWVkaWFuX3JkbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVkaWFuX3JkbmJyKSkKcmVzJG1lZGlhbl9iYXMgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRtZWRpYW5fYmFzKSkKcmVzJHE5NV9kbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcTk1X2RuYnIpKQpyZXMkcTk1X3JkbmJyID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcTk1X3JkbmJyKSkKcmVzJHE5NV9iYXMgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRxOTVfYmFzKSkKCgpyZXMgPSByZXNbLTEsXQpyZXMkcGVyX2JhID0gcmVzJGdyb3d0aC9yZXMkdG90YWxfYXJlYQpyZXMkZ3Jvd3RoX2ttID1yZXMkZ3Jvd3RoLzEwMDAwMDAKCnJlcyRodW1hbiA9IDAKcmVzJGh1bWFuW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0xNCAmIHJlcyRjYXVzZSAhPTE3XT0xCnJlcyRodW1hbltyZXMkY2F1c2UgPT0xIF09MgoKcmVzJHJvc19rbSA9IChyZXMkbWVkaWFuOTVfcm9zKjI0KS8xMDAwCnJlcyRyb3NfbWVhbl9rbSA9IChyZXMkbWVhbl9yb3MqMjQpLzEwMDAKCmBgYAojIyMjIyMjIyAgaXMgdGhlcmUgcmVsYXRpb24gYmV0d2VlbiBkYXlzIHVudGlsbCA3NSUgYW5kIGZpcmUgc2l6ZSAjIyMjIyMjIyMjCgpgYGB7cn0KZHIxID1zaGFwZWZpbGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL2RhdGEvRlJBUC9maXJlMThfMS5zaHAiKQpkcjEkWUVBUl89YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZHIxJFlFQVJfKSkKZHIxJFNoYXBlX0FyZWE9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZHIxJFNoYXBlX0FyZWEpKQpkcjE9ZHIxWyFpcy5uYShkcjEkWUVBUl8pLCBdCmRyMT1kcjFbZHIxJFlFQVJfPjIwMTEsXQoKZmkgPSBkcjFbZHIxJE9CSkVDVElEPT0xNzQ5NSxdCmRyMT1zdWJzZXQoZHIxLCBHSVNfQUNSRVM+MzAwKQoKc3VtbWFyeShkcjEpCnJlczc1ID0gcmVzW3JlcyRwZXJfYmEgPiAwLjk5OSxdCgpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShyZXM3NSRmaXJlX2RheSwgYnkgPSBsaXN0KHJlczc1JGZpcmVuYW1lLHJlczc1JHllYXIpLCBtaW4pKQpwPTEzCnllYXIxPTAKZmlyc3Q9MApsYXN0PTAKbGVuX2Q9MApkYXk3NT0wCmZpcmVuYW0xPTAKbmFtZV9maXJlPTAKc2l6ZT0wCms9MApmb3IgKHAgaW4gMToobGVuZ3RoKHBlYWtfZGF5MSRHcm91cC4xKSkpCnsKICBwcmludChwKQogIHllYXIgPSBwZWFrX2RheTFbcCwyXQogICAgZmlyZW5hbSA9IGFzLmNoYXJhY3RlcihwZWFrX2RheTFbcCwxXSkgCiAgCiAgZmlyID0gZHIxW3doaWNoKGRyMSRZRUFSXz09eWVhciAmIGRyMSRGSVJFX05BTUU9PWZpcmVuYW0pLF0KICBpZiAobGVuZ3RoKGZpcik+MSl7CiAgICBtYXhzaXplID0gbWF4KGZpciRHSVNfQUNSRVMpCiAgICBmaXIgPSBmaXJbZmlyJEdJU19BQ1JFUyA9PSAgbWF4c2l6ZSxdCiAgfQogIAogIGlmICghaXMubmEoZmlyJEFMQVJNX0RBVEUpICB8ICFpcy5uYShmaXIkQUxBUk1fREFURSkpewogICAgaz1rKzEKICAgIGRheTc1W2tdID0gcGVha19kYXkxW3AsM10KICAgIGZpcmVuYW0xW2tdPWZpcmVuYW0gCiAgeWVhcjFba10gPSB5ZWFyCiAgZmlyc3Rba109IGZpciRBTEFSTV9EQVRFCiAgbGFzdFtrXSA9IGZpciRDT05UX0RBVEUKICBsZW5fZFtrXSA9IGFzLm51bWVyaWMoYXMuRGF0ZShmaXIkQ09OVF9EQVRFKSAtYXMuRGF0ZShmaXIkQUxBUk1fREFURSkpCiBuYW1lX2ZpcmVba109IGZpciRPQkpFQ1RJRAogICAgc2l6ZVtrXSA9IGZpciRHSVNfQUNSRVMKICB9Cn0KcGxvdChsZW5fZCxkYXk3NSwgeGxhYj0iZmlyZSBkdXJhdGlvbiBGUkFQIChkYXlzKSIsIHlsYWI9ImZpcmUgZHVyYXRpb24gVklJUlMgKGRheXMpIikKCmBgYAoKCgoKIyMjIyMjIyBwbG90IG1lYW4gdnMgbWF4IGZpcmUgcmF0ZS1vZi1zcHJlYWQgIyMjIyMjIyMjIyMjIyMjIyMjCmBgYHtyfQojc3VtbWFyeShyZXMpCnBsb3QocmVzJHJvc19rbSxyZXMkcm9zX21lYW5fa20sIHhsYWI9Im1heGltdW0gZmlyZS1zcHJlYWQtcmF0ZSAoa20vZGF5Iix5bGFiPSJtZWFuIGZpcmUtc3ByZWFkLXJhdGUgKGttL2RheSkiKQoKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9tZWFuX3ZzX21heF9yb3NfdjEucGRmIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA3KQpwbG90KHJlcyRyb3Nfa20scmVzJHJvc19tZWFuX2ttLCB4bGltPWMoMCwyNSkseWxpbT1jKDAsMTApLCB4bGFiPSJmaXJlIHJhdGUtb2Ytc3ByZWFkIChrbS9kYXkpIix5bGFiPSJtZWFuIGZpcmUgcmF0ZS1vZi1zcHJlYWQgKGttL2RheSkiLCBjZXgubGFiPTEuMyxjZXguYXhpcyA9IDEuMjUpCmRldi5vZmYoKQoKYGBgCgoKCiMjIyMjIyMjIyMjIyBkaWZmZXJlbmNlIGJldHdlZW4gaHVtYW4gYW5kIGxpZ2h0bmlnbiBmaXJlcyAjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9Cm1lPTAKbWUxPTAKZGF5cyA9IGMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikKZGF5czEgPSBjKCIxIiwiMiIsIjMiLCI0IiwiNSIpCnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSxdCnBybzIgPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSxdCnBybzUgPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMSxdCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMixdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIsXQpwcm8zaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAyLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMixdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIsXQptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEub21pdD1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5vbWl0PVQpCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKYm94cGxvdChwcm8xaCRncm93dGhfa20scHJvMmgkZ3Jvd3RoX2ttLHBybzNoJGdyb3d0aF9rbSxwcm80aCRncm93dGhfa20scHJvNWgkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ3VyZTFfdjIucGRmIiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNSkKcGFyKG1mcm93PWMoMSwyKSkKcGFyKG1hcj1jKDQsIDQsIDEsMC4xKSkKcGFyKG1ncD1jKDIuMywxLDApKQpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoIjEiLCIyIiwiMyIsIjQiLCI1IikseGxhYj0iRGF5IHNpbmNlIGZpcmUgc3RhcnQiLHlsYWI9IGV4cHJlc3Npb24oJ0ZpcmUgc2l6ZSAoa20nXjIqJyknKSx5bGltPWMoMCwyMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKdGV4dCgwLjMsMTk1LCJhKSIscG9zPTQsIGNleD0xLjQpCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCIxIiwiMiIsIjMiLCI0IiwiNSIpLHhsYWI9IkRheSBzaW5jZSBmaXJlIHN0YXJ0Iix5bGFiPSAiIix5bGltPWMoMCwyMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKdGV4dCgwLjMsMTk1LCJiKSIscG9zPTQsIGNleD0xLjQpCmRldi5vZmYoKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWd1cmUxX3YyLnBkZiIsIHdpZHRoID0gMTAsIGhlaWdodCA9IDUpCnBhcihtZnJvdz1jKDEsMikpCnBhcihtYXI9Yyg0LCA0LCAxLDAuMSkpCnBhcihtZ3A9YygyLjMsMSwwKSkKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCIxIiwiMiIsIjMiLCI0IiwiNSIpLHhsYWI9IkRheSBzaW5jZSBmaXJlIHN0YXJ0Iix5bGFiPSBleHByZXNzaW9uKCdGaXJlIHNpemUgKGttJ14yKicpJykseWxpbT1jKDAsNzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCnRleHQoMC4zLDY5MCwiYSkiLHBvcz00LCBjZXg9MS40KQpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiMSIsIjIiLCIzIiwiNCIsIjUiKSx4bGFiPSJEYXkgc2luY2UgZmlyZSBzdGFydCIseWxhYj0gIiIseWxpbT1jKDAsNzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCnRleHQoMC4zLDY5MCwiYikiLHBvcz00LCBjZXg9MS40KQpkZXYub2ZmKCkgCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvYWxsX3YzLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsY2V4LmF4aXM9MS40LCBsdHkgPSAxLCBsd2QgPSAyKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSxjZXguYXhpcz0xLjQpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKbGVnZW5kKHg9InRvcGxlZnQiLCBsZWdlbmQ9YygiaHVtYW4iLCJsaWdodG5pbmciKSxjb2w9ImJsYWNrIixsdHkgPSBjKDEsMikscGNoPTEsYnR5ID0gIm4iLGx3ZCA9IDIsY2V4PTEuNSwgcHQuY2V4ID0gMSkKCmRldi5vZmYoKSAKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIzMgZm9yIHdlc3Rlcm4gY29yZGlsbGVyYSBlY29yZWdpb24gICMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KbWU9MAptZTE9MApwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDI1MCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMjUwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvbm9ydGhfdjIucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMixjZXguYXhpcz0xLjQpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxLGNleC5heGlzPTEuNCkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKdC50ZXN0KGxvZyhwcm8xJGdyb3d0aF9rbSksbG9nKHBybzFoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvMiRncm93dGhfa20pLGxvZyhwcm8yaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzMkZ3Jvd3RoX2ttKSxsb2cocHJvM2gkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm80JGdyb3d0aF9rbSksbG9nKHBybzRoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNSRncm93dGhfa20pLGxvZyhwcm81aCRncm93dGhfa20pKQoKbWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgbWVkaXRlcmFuZWFuIGNhbGlmb3JuaWEgICMjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9CnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgKHJlcyRlY28xID09IDExKSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgKHJlcyRlY28xID09IDExKSxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9tZWRfdjIucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLGNleC5heGlzPTEuNCwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxLGNleC5heGlzPTEuNCkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKYGBgCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgZGlmZmVyZW5jZSBpbiBhdXR1bW4gICMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoID44LF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoID44LF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoID44LF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoID44LF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoID44LF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA+OCxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPjgsXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoID44LF0KcHJvNWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA+OCxdCgpib3hwbG90KHBybzFoJGdyb3d0aF9rbSxwcm8yaCRncm93dGhfa20scHJvM2gkZ3Jvd3RoX2ttLHBybzRoJGdyb3d0aF9rbSxwcm81aCRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgptZVsxXSA9bWVhbihwcm8xJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzJdID1tZWFuKHBybzIkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbM10gPW1lYW4ocHJvMyRncm93dGhfa20sbmEub21pdD1UKQptZVs0XSA9bWVhbihwcm80JGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzVdID1tZWFuKHBybzUkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKCm1lMVsxXSA9bWVhbihwcm8xaCRncm93dGhfa20sbmEucm09VCkKbWUxWzJdID1tZWFuKHBybzJoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbM10gPW1lYW4ocHJvM2gkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs0XSA9bWVhbihwcm80aCRncm93dGhfa20sbmEucm09VCkKbWUxWzVdID1tZWFuKHBybzVoJGdyb3d0aF9rbSxuYS5ybT1UKQoKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvYXV0dW1uX3YyLnBkZiIsIHdpZHRoID0gNCwgaGVpZ2h0ID0gNSkKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDI1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsY2V4LmF4aXM9MS40LCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzMSxjZXguYXhpcz0xLjQpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKZGV2Lm9mZigpIAoKCmBgYAoKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIHN1bW1lciAgIyMjIyMjIyMjIyMjIyMjIyMjCgpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCAsXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KcHJvMyA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMyAmIHJlcyRodW1hbiA9PSAxICYgcmVzJG1vbnRoIDw9OCxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmIHJlcyRtb250aCA8PTgsXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiByZXMkbW9udGggPD04LF0KCmJveHBsb3QocHJvMSRncm93dGhfa20scHJvMiRncm93dGhfa20scHJvMyRncm93dGhfa20scHJvNCRncm93dGhfa20scHJvNSRncm93dGhfa20sbmFtZXM9YygiZGF5MSIsImRheTIiLCJkYXkzIiwiZGF5NCIsImRheTUiKSx4bGFiPSIiLHlsYWI9ImZpcmUgc2l6ZSAoa20yKSIseWxpbT1jKDAsMzAwKSwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCgpwcm8xaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmIHJlcyRtb250aCA8PTgsXQpwcm80aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAyICYgcmVzJG1vbnRoIDw9OCxdCnBybzVoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDIgJiByZXMkbW9udGggPD04LF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgoKcGFyKG1ncD1jKDIuMywxLDApKSAgCnBsb3QobWUsdHlwZT0ibyIsIHlsaW09YygwLDE1MCkseWxhYj1leHByZXNzaW9uKCJmaXJlIHNpemUgKGttIl4yKiIpIikseGxhYj0iIiwgeGF4dD0nbicsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMpCnBvaW50cyhtZTEsdHlwZT0ibyIsbHR5ID0gMiwgbHdkID0gMikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNC9zdW1tZXJfdjIucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJyxjZXguYXhpcz0xLjQsIGx0eSA9IDEsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxLGNleC5heGlzPTEuNCkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgZGlmZmVyZW5jZSBpbiBzdW1tZXIgaW4gd2VzdGVybiBjb3JkaWxsZXJhICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnQudGVzdChsb2cocHJvMSRncm93dGhfa20pLGxvZyhwcm8xaCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzIkZ3Jvd3RoX2ttKSxsb2cocHJvMmgkZ3Jvd3RoX2ttKSkKdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCnQudGVzdChsb2cocHJvNCRncm93dGhfa20pLGxvZyhwcm80aCRncm93dGhfa20pKQp0LnRlc3QobG9nKHBybzUkZ3Jvd3RoX2ttKSxsb2cocHJvNWgkZ3Jvd3RoX2ttKSkKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L25vcnRoX3N1bW1lcl92Mi5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsY2V4LmF4aXM9MS40LCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEsY2V4LmF4aXM9MS40KQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKCiMjIyMjIyMjIyMjIyMjIyMjIyBmb3IgZGlmZmVyZW5jZSBpbiBhdXR1bW4gaW4gd2VzdGVybiBjb3JkaWxsZXJhICAjIyMjIyMjIyMjIyMjIyMjIyMKYGBge3J9CnBybzEgPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvMiA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzQgPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSA2IHwgcmVzJGVjbzEgPT0gNyksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzJoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzNoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDYgfCByZXMkZWNvMSA9PSA3KSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAocmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KcHJvNWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gNiB8IHJlcyRlY28xID09IDcpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L25vcnRoX2F1dHVtbl92Mi5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwyNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLGNleC5heGlzPTEuNCwgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEsY2V4LmF4aXM9MS40KQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIHN1bW1lciBpbiBtZWRpdGVyZWFuZWFuICAjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpwcm8xID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8zID0gcmVzW3JlcyRmaXJlX2RheSA9PSAzICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm80ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQoKYm94cGxvdChwcm8xJGdyb3d0aF9rbSxwcm8yJGdyb3d0aF9rbSxwcm8zJGdyb3d0aF9rbSxwcm80JGdyb3d0aF9rbSxwcm81JGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCnBybzFoID0gcmVzW3JlcyRmaXJlX2RheSA9PSAxICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yaCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMiAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoIDw9OCAmIHJlcyRtb250aCA+NSApICYgKHJlcyRlY28xID09IDExKSxdCnBybzRoID0gcmVzW3JlcyRmaXJlX2RheSA9PSA0ICYgcmVzJGh1bWFuID09IDIgJiAoIHJlcyRtb250aCA8PTggJiByZXMkbW9udGggPjUgKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81aCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNSAmIHJlcyRodW1hbiA9PSAyICYgKCByZXMkbW9udGggPD04ICYgcmVzJG1vbnRoID41ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCiN0LnRlc3QobG9nKHBybzEkZ3Jvd3RoX2ttKSxsb2cocHJvMWgkZ3Jvd3RoX2ttKSkKI3QudGVzdChsb2cocHJvMiRncm93dGhfa20pLGxvZyhwcm8yaCRncm93dGhfa20pKQojdC50ZXN0KGxvZyhwcm8zJGdyb3d0aF9rbSksbG9nKHBybzNoJGdyb3d0aF9rbSkpCiN0LnRlc3QobG9nKHBybzQkZ3Jvd3RoX2ttKSxsb2cocHJvNGgkZ3Jvd3RoX2ttKSkKI3QudGVzdChsb2cocHJvNSRncm93dGhfa20pLGxvZyhwcm81aCRncm93dGhfa20pKQoKbWVbMV0gPW1lYW4ocHJvMSRncm93dGhfa20sbmEub21pdD1UKQptZVsyXSA9bWVhbihwcm8yJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzNdID1tZWFuKHBybzMkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNF0gPW1lYW4ocHJvNCRncm93dGhfa20sbmEub21pdD1UKQptZVs1XSA9bWVhbihwcm81JGdyb3d0aF9rbSxuYS5vbWl0PVQpCgptZTFbMV0gPW1lYW4ocHJvMWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVsyXSA9bWVhbihwcm8yaCRncm93dGhfa20sbmEucm09VCkKbWUxWzNdID1tZWFuKHBybzNoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNF0gPW1lYW4ocHJvNGgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVs1XSA9bWVhbihwcm81aCRncm93dGhfa20sbmEucm09VCkKCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLCBsdHkgPSAxLCBsd2QgPSAyLGNleC5sYWI9MS4yKQpheGlzKHNpZGU9MSwgYXQ9YygxOjUpLGxhYmVscz1kYXlzKQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzQvbWVkX3N1bW1lcl92Mi5wZGYiLCB3aWR0aCA9IDQsIGhlaWdodCA9IDUpCnBhcihtZ3A9YygyLjMsMSwwKSkgIApwbG90KG1lLHR5cGU9Im8iLCB5bGltPWMoMCwxNTApLHlsYWI9ZXhwcmVzc2lvbigiZmlyZSBzaXplIChrbSJeMioiKSIpLHhsYWI9IiIsIHhheHQ9J24nLGNleC5heGlzPTEuNCwgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5czEsY2V4LmF4aXM9MS40KQpwb2ludHMobWUxLHR5cGU9Im8iLGx0eSA9IDIsIGx3ZCA9IDIpCmRldi5vZmYoKSAKCgpgYGAKCmAKIyMjIyMjIyMjIyMjIyMjIyMjIGZvciBkaWZmZXJlbmNlIGluIGF1dHVtbiBpbiBtZWRpdGVyYW5lYW4gICMjIyMjIyMjIyMjIyMjIyMjIwpgYGB7cn0KcHJvMSA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gMSAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm8yID0gcmVzW3JlcyRmaXJlX2RheSA9PSAyICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCnBybzMgPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMSAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNCA9IHJlc1tyZXMkZmlyZV9kYXkgPT0gNCAmIHJlcyRodW1hbiA9PSAxICYgKCByZXMkbW9udGggPjggKSAmIChyZXMkZWNvMSA9PSAxMSksXQpwcm81ID0gcmVzW3JlcyRmaXJlX2RheSA9PSA1ICYgcmVzJGh1bWFuID09IDEgJiAoIHJlcyRtb250aCA+OCApICYgKHJlcyRlY28xID09IDExKSxdCgpib3hwbG90KHBybzEkZ3Jvd3RoX2ttLHBybzIkZ3Jvd3RoX2ttLHBybzMkZ3Jvd3RoX2ttLHBybzQkZ3Jvd3RoX2ttLHBybzUkZ3Jvd3RoX2ttLG5hbWVzPWMoImRheTEiLCJkYXkyIiwiZGF5MyIsImRheTQiLCJkYXk1IikseGxhYj0iIix5bGFiPSJmaXJlIHNpemUgKGttMikiLHlsaW09YygwLDMwMCksIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQoKcHJvMWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDEgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvMmggPSByZXNbcmVzJGZpcmVfZGF5ID09IDIgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvM2ggPSByZXNbcmVzJGZpcmVfZGF5ID09IDMgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNGggPSByZXNbcmVzJGZpcmVfZGF5ID09IDQgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KcHJvNWggPSByZXNbcmVzJGZpcmVfZGF5ID09IDUgJiByZXMkaHVtYW4gPT0gMiAmICggcmVzJG1vbnRoID44ICkgJiAocmVzJGVjbzEgPT0gMTEpLF0KCmJveHBsb3QocHJvMWgkZ3Jvd3RoX2ttLHBybzJoJGdyb3d0aF9rbSxwcm8zaCRncm93dGhfa20scHJvNGgkZ3Jvd3RoX2ttLHBybzVoJGdyb3d0aF9rbSxuYW1lcz1jKCJkYXkxIiwiZGF5MiIsImRheTMiLCJkYXk0IiwiZGF5NSIpLHhsYWI9IiIseWxhYj0iZmlyZSBzaXplIChrbTIpIix5bGltPWMoMCwzMDApLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKCm1lWzFdID1tZWFuKHBybzEkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbMl0gPW1lYW4ocHJvMiRncm93dGhfa20sbmEub21pdD1UKQptZVszXSA9bWVhbihwcm8zJGdyb3d0aF9rbSxuYS5vbWl0PVQpCm1lWzRdID1tZWFuKHBybzQkZ3Jvd3RoX2ttLG5hLm9taXQ9VCkKbWVbNV0gPW1lYW4ocHJvNSRncm93dGhfa20sbmEub21pdD1UKQoKbWUxWzFdID1tZWFuKHBybzFoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbMl0gPW1lYW4ocHJvMmgkZ3Jvd3RoX2ttLG5hLnJtPVQpCm1lMVszXSA9bWVhbihwcm8zaCRncm93dGhfa20sbmEucm09VCkKbWUxWzRdID1tZWFuKHBybzRoJGdyb3d0aF9rbSxuYS5ybT1UKQptZTFbNV0gPW1lYW4ocHJvNWgkZ3Jvd3RoX2ttLG5hLnJtPVQpCgpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsMTUwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSwgbHdkID0gMixjZXgubGFiPTEuMikKYXhpcyhzaWRlPTEsIGF0PWMoMTo1KSxsYWJlbHM9ZGF5cykKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQoKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc0L21lZF9hdXR1bW5fdjIucGRmIiwgd2lkdGggPSA0LCBoZWlnaHQgPSA1KQpwYXIobWdwPWMoMi4zLDEsMCkpICAKcGxvdChtZSx0eXBlPSJvIiwgeWxpbT1jKDAsNDAwKSx5bGFiPWV4cHJlc3Npb24oImZpcmUgc2l6ZSAoa20iXjIqIikiKSx4bGFiPSIiLCB4YXh0PSduJywgbHR5ID0gMSxjZXguYXhpcz0xLjQsIGx3ZCA9IDIsY2V4LmxhYj0xLjIpCmF4aXMoc2lkZT0xLCBhdD1jKDE6NSksbGFiZWxzPWRheXMxLGNleC5heGlzPTEuNCkKcG9pbnRzKG1lMSx0eXBlPSJvIixsdHkgPSAyLCBsd2QgPSAyKQpkZXYub2ZmKCkgCgoKYGBgCgojIyMjIyMjIyMjIyMgaG93IG1hbnkgZGF5cyBkb2VzIGl0IHRha2UgdG8gcmVhY2ggNzUlIGJ1cm50IGFyZWEgIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQpyZXM3NSA9IHJlc1tyZXMkcGVyX2JhID4gMC43NSxdCiNwZWFrX2RheSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKHJlczc1JGZpcmVfZGF5LCBieSA9IGxpc3QocmVzNzUkZmlyZW5hbWUscmVzNzUkY2F1c2UpLCBtaW4pKQojcGVha19kYXk9c3Vic2V0KHBlYWtfZGF5LHggPCA1NSkKI2hpID0gaGlzdChwZWFrX2RheSR4LHByb2IgPUYsIGJyZWFrcz0gYygwOjU0KSwgeGxpbT1jKDAsNTUpLCB5bGFiPSJudW1iZXIgb2YgZmlyZXMiLCB4bGFiPSJkYXlzIiwgY2V4LmxhYj0xLjQsY2V4LmF4aXM9MS4zKQoKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCApCgoKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCnBlYWs9YXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUocmVzNzUkZmlyZV9kYXksIGJ5ID0gbGlzdChyZXM3NSRmaXJlbmFtZSksIG1pbikpCnF1YW50aWxlKHBlYWtfZGF5MSR4LDAuNTAsdHlwZT0zKSAKcXVhbnRpbGUocGVha19kYXkyJHgsMC41MCx0eXBlPTMpIAoKcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCmhpc3QuYSA9aGlzdChwZWFrX2RheTEkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpoaXN0LmIgPWhpc3QocGVha19kYXkyJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcseGxhYj0iRGF5cyBhZnRlciBpZ25pdGlvbiIseWxhYj0iTnVtYmVyIG9mIGZpcmVzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMywgeGxpbT1jKDEsNjUpLCB5bGltPWMoMCwzMCkpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3RpbWVfdG9fcmVhY2g3NS5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDMwKSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBtZWRpdGVyYW5lYW4gICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAmIHJlczc1JGVjbzEgPT0gMTEpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzNzUsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiByZXM3NSRlY28xID09IDExKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKCnBlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQpoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L21lZC5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDE1KSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBub3J0aCBjYWwgICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSkKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9ub3J0aC5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDE1KSkKYXhpcygxLGMoMC43LDUuNSwxMS41LDE3LjUsMjMuNSwyOS41LDM1LjUsNDEuNSw0Ny41LDUzLjUsNTkuNSw2NS41KSxsYWJlbHM9YygxLDUsMTAsMTUsMjAsMjUsMzAsMzUsNDAsNDUsNTAsNTUpLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCiMjIyMjIyMjICBtZWRpdGVyYW5lYW4gIFNVTU1FUiAjIyMjIyMjIyMjIwpvdXQxID0gc3Vic2V0KHJlczc1LGNhdXNlID09IDEgJiByZXM3NSRlY28xID09IDExICYgKCByZXM3NSRtb250aCA8PTggJiByZXM3NSRtb250aCA+NSApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgcmVzNzUkZWNvMSA9PSAxMSAmICggcmVzNzUkbW9udGggPD04ICYgcmVzNzUkbW9udGggPjUgKSkKcGVha19kYXkxID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MSRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDEkZmlyZW5hbWUpLCBtaW4pKQpwZWFrX2RheTIgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQyJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MiRmaXJlbmFtZSksIG1pbikpCgpwZWFrX2RheTE9c3Vic2V0KHBlYWtfZGF5MSx4IDwgNTYpCnBlYWtfZGF5Mj1zdWJzZXQocGVha19kYXkyLHggPCA1NikKaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9tZWRfc3VtbWVyLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMTApKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG5vcnRoIGNhbCAgc3VtbWVyICMjIyMjIyMjIyMjCm91dDEgPSBzdWJzZXQocmVzNzUsY2F1c2UgPT0gMSAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSYgKCByZXM3NSRtb250aCA8PTggJiByZXM3NSRtb250aCA+NSApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpJiAoIHJlczc1JG1vbnRoIDw9OCAmIHJlczc1JG1vbnRoID41ICkpCnBlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKcGVha19kYXkxPXN1YnNldChwZWFrX2RheTEseCA8IDU2KQpwZWFrX2RheTI9c3Vic2V0KHBlYWtfZGF5Mix4IDwgNTYpCmhpc3QuYSA9aGlzdChwZWFrX2RheTEkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpoaXN0LmIgPWhpc3QocGVha19kYXkyJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpwZGYoZmlsZT0iL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9zdXBfZmlnNV90aW1lNzUvbm9ydGhfc3VtbWVyLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsMTIpKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQoKIyMjIyMjIyMgIG1lZGl0ZXJhbmVhbiAgYXV0dW1uIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICYgcmVzNzUkZWNvMSA9PSAxMSAmICggcmVzNzUkbW9udGggPjgpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlczc1LGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgcmVzNzUkZWNvMSA9PSAxMSAmICggcmVzNzUkbW9udGggPjggKSkKI3BlYWtfZGF5MSA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDEkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQxJGZpcmVuYW1lKSwgbWluKSkKcGVha19kYXkyID0gYXMuZGF0YS5mcmFtZShhZ2dyZWdhdGUob3V0MiRmaXJlX2RheSwgYnkgPSBsaXN0KG91dDIkZmlyZW5hbWUpLCBtaW4pKQoKI3BlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQojaGlzdC5hID1oaXN0KHBlYWtfZGF5MSR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmhpc3QuYiA9aGlzdChwZWFrX2RheTIkeCxicmVha3MgPWMoMDo1NSkscGxvdD1GKQpmZyA9IHJiaW5kKDAsaGlzdC5iJGNvdW50cykKCnBkZihmaWxlPSIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL3N1cF9maWc1X3RpbWU3NS9tZWRfYXV0dW1uLnBkZiIsd2lkdGg9NyxoZWlnaHQ9NSkKZnIgPSBiYXJwbG90KGZnLHhsYWI9IkRheXMgYWZ0ZXIgaWduaXRpb24iLHlsYWI9Ik51bWJlciBvZiBmaXJlcyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsIHhsaW09YygxLDY1KSwgeWxpbT1jKDAsNSkpCmF4aXMoMSxjKDAuNyw1LjUsMTEuNSwxNy41LDIzLjUsMjkuNSwzNS41LDQxLjUsNDcuNSw1My41LDU5LjUsNjUuNSksbGFiZWxzPWMoMSw1LDEwLDE1LDIwLDI1LDMwLDM1LDQwLDQ1LDUwLDU1KSxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpCgojIyMjIyMjIyAgbm9ydGggY2FsICBhdXR1bW4gIyMjIyMjIyMjIyMKb3V0MSA9IHN1YnNldChyZXM3NSxjYXVzZSA9PSAxICAmIChyZXM3NSRlY28xID09IDYgfCByZXM3NSRlY28xID09IDcpJiAoIHJlczc1JG1vbnRoID44KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXM3NSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAgJiAocmVzNzUkZWNvMSA9PSA2IHwgcmVzNzUkZWNvMSA9PSA3KSYgKCByZXM3NSRtb250aCA+OCApKQpwZWFrX2RheTEgPSBhcy5kYXRhLmZyYW1lKGFnZ3JlZ2F0ZShvdXQxJGZpcmVfZGF5LCBieSA9IGxpc3Qob3V0MSRmaXJlbmFtZSksIG1pbikpCnBlYWtfZGF5MiA9IGFzLmRhdGEuZnJhbWUoYWdncmVnYXRlKG91dDIkZmlyZV9kYXksIGJ5ID0gbGlzdChvdXQyJGZpcmVuYW1lKSwgbWluKSkKCnBlYWtfZGF5MT1zdWJzZXQocGVha19kYXkxLHggPCA1NikKcGVha19kYXkyPXN1YnNldChwZWFrX2RheTIseCA8IDU2KQpoaXN0LmEgPWhpc3QocGVha19kYXkxJHgsYnJlYWtzID1jKDA6NTUpLHBsb3Q9RikKaGlzdC5iID1oaXN0KHBlYWtfZGF5MiR4LGJyZWFrcyA9YygwOjU1KSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKcGRmKGZpbGU9Ii9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3Mvc3VwX2ZpZzVfdGltZTc1L25vcnRoX2F1dHVtbi5wZGYiLHdpZHRoPTcsaGVpZ2h0PTUpCmZyID0gYmFycGxvdChmZyx4bGFiPSJEYXlzIGFmdGVyIGlnbml0aW9uIix5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLCB4bGltPWMoMSw2NSksIHlsaW09YygwLDUpKQpheGlzKDEsYygwLjcsNS41LDExLjUsMTcuNSwyMy41LDI5LjUsMzUuNSw0MS41LDQ3LjUsNTMuNSw1OS41LDY1LjUpLGxhYmVscz1jKDEsNSwxMCwxNSwyMCwyNSwzMCwzNSw0MCw0NSw1MCw1NSksY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKQpgYGAKCgpgYGB7cn0KCnJlcz1yZXNbcmVzJHJvc19rbT4wLF0KcmVzX2YgPSByZXNbcmVzJG1heF9sYW5kID09IDEsXQpyZXNfcCA9IHJlc1tyZXMkbWF4X2xhbmQgIT0gMSxdCgpzdW1tYXJ5KGxtKGxvZyhyZXMkbWVhbl9mcnApfmxvZyhyZXMkcm9zX2ttKSkpCgojanVzdCBzaG93IHRoZSBwbG90IGhlcmUKcGxvdChyZXNfZiRtZWFuX2ZycH5yZXNfZiRyb3Nfa20sbG9nPSJ4eSIseGxpbT1jKDAuMDA1LDMwKSx5bGltPWMoMC4xLDE4MCkseGF4dD0ibiIseWxhYj0ibWVhbiBGUlAgKE1XKSIseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMyxjb2w9ImRhcmtncmVlbiIpCgptYXJrcz1jKDAuMDEsMC4xLDEsMTApCm1hcmtzMT1jKDAuMSwwLjUsNSw1MCkKCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX0ZSUF9yb3NfdjMucGRmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1KQpwbG90KHJlc19mJG1lYW5fZnJwfnJlc19mJHJvc19rbSxsb2c9Inh5Iix4bGltPWMoMC4wMDUsMzApLHlsaW09YygwLjEsMTgwKSx4YXh0PSJuIix5YXh0PSJuIix5bGFiPSJtZWFuIEZSUCAoTVcpIix4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLCBjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMyxjb2w9ImRhcmtncmVlbiIpCnBvaW50cyhyZXNfcCRtZWFuX2ZycH5yZXNfcCRyb3Nfa20sY29sPSJvcmFuZ2UiKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCmF4aXMoMixhdD1tYXJrczEsbGFiZWxzPW1hcmtzMSxjZXguYXhpcz0xLjQgKQpsZWdlbmQoIHg9InRvcGxlZnQiLGxlZ2VuZD1jKCJGb3Jlc3QiLCJHcmFzcyAmIHNocnViIiksY29sPWMoImRhcmtncmVlbiIsIm9yYW5nZSIpLGNleD0xLjIscGNoPTEsYnR5ID0gIm4iKQpkZXYub2ZmKCkKCgoKYGBgCgojIyMjIyMjIyBGUlAgdnMgdHJlZSBtb3J0YWxpdHkKYGBge3J9CnN1bW1hcnkocmVzKQpyZXM9cmVzW3JlcyRyb3Nfa20+MCxdCgpkYXRhX3Rlc3QxID0gcmVzW3JlcyRodW1hbiA9PSAxICYgcmVzJG1heF9sYW5kIDwxLjUsXQpkYXRhX3Rlc3QyID0gcmVzMVtyZXMkaHVtYW4gPT0gMiAmIHJlcyRtYXhfbGFuZCA8MS41LF0KCnN1bW1hcnkobG0obG9nKHJlcyRtZWFuX2ZycCl+cmVzJG1lYW5fYmFzKSkKCiNqdXN0IHNob3cgdGhlIHBsb3QgaGVyZQpwbG90KHJlcyRtZWFuX2Jhc35yZXMkbWVhbl9mcnAsbG9nPSJ4Iix5bGltPWMoMCwxMDApLHhsaW09YygwLjEsMjAwKSx5bGFiPSJtZWFuIHRyZWUgbW9ydGFsaXR5Iix4bGFiPSJtZWFuIEZSUCAoTVcpIiwgY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMsY29sPSJkYXJrZ3JlZW4iKQoKbWFya3M9YygwLjEsMSwxMCwxMDApCm1hcmtzMT1jKDAsMjUsNTAsNzUsMTAwKQoKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfRlJQX21vcnRhbGl0eV92MS5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCnBsb3QocmVzJG1lYW5fYmFzfnJlcyRtZWFuX2ZycCxsb2c9IngiLHlsaW09YygwLDEwMCkseGxpbT1jKDAuMSwyMDApLHhheHQ9Im4iLHlheHQ9Im4iLHlsYWI9IlRyZWUgbW9ydGFsaXR5ICglKSIseGxhYj0ibWVhbiBGUlAgKE1XKSIsIGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zLGNvbD0iZGFya2dyZWVuIikKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQpheGlzKDIsYXQ9bWFya3MxLGxhYmVscz1tYXJrczEsY2V4LmF4aXM9MS40ICkKZGV2Lm9mZigpCgpgYGAKCgoKCmBgYHtyfQpkYXRhX3M9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2RhaWx5X21lYW5fcm9zX2ROQlJfVjYudHh0Iixyb3cubmFtZXM9TlVMTCkKcm93bmFtZXMoZGF0YV9zKSA8LSBjKCkKCmRhdGFfczEgPSBhcy5kYXRhLmZyYW1lKGRhdGFfc1ssMjoxOV0pCgoKbmFtZXMoZGF0YV9zMSkgPSBjKCJsb24iLCJsYXQiLCJmaXJlIiwibnJfZGF5IiwibWF4X2xhbmQiLCJtZWFuX2xhbmQiLCJlbGV2YXRpb24iLCJiaW9tYXNzIiwibWVhbl9yb3MiLCJyb3M5NSIsIm1lYW5fZG5iciIsImRuYnI5NSIsIm1lYW5fcmRuYnIiLCJyZG5icjk1IiwibWVhbl9CQV9yZWQiLCJCQV9yZWQ5NSIsImNhdXNlIiwic2l6ZSIpCmxlbmd0aChkYXRhX3MxJGxvbikKZGF0YV9zMSRtZWFuX3JvcyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRtZWFuX3JvcykpCmRhdGFfczEkcm9zOTUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkcm9zOTUpKQpkYXRhX3MxJG1lYW5fZG5iciA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRtZWFuX2RuYnIpKQpkYXRhX3MxJGRuYnI5NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRkbmJyOTUpKQpkYXRhX3MxJG1lYW5fcmRuYnIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9yZG5icikpCmRhdGFfczEkcmRuYnI5NSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRyZG5icjk1KSkKZGF0YV9zMSRsb24gPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbG9uKSkKZGF0YV9zMSRsYXQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbGF0KSkKCmRhdGFfczEkbWVhbl9sYW5kW2lzLm5hKGRhdGFfczEkbWVhbl9sYW5kKV09ZGF0YV9zMSRtYXhfbGFuZFtpcy5uYShkYXRhX3MxJG1lYW5fbGFuZCldICNtZWFuIGxhbmRjb3ZlciBnaXZlcyBOQSB3aGVuIG9ubHkgb25lIGxhbmRjb3ZlciBpcyBwcmVzZW50CmRhdGFfczEkbWVhbl9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJG1lYW5fbGFuZCkpCmRhdGFfczEkbWVhbl9CQV9yZWQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkbWVhbl9CQV9yZWQpKQpkYXRhX3MxJEJBX3JlZDk1ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJEJBX3JlZDk1KSkKZGF0YV9zMSRiaW9tYXNzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGJpb21hc3MpKQpkYXRhX3MxJGVsZXZhdGlvbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGF0YV9zMSRlbGV2YXRpb24pKQpkYXRhX3MxJGNhdXNlID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJGNhdXNlKSkKZGF0YV9zMSRzaXplID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihkYXRhX3MxJHNpemUpKQoKCmRhdGFfczE9bmEub21pdChkYXRhX3MxKQoKc2hhcGUgPSBzaGFwZWZpbGUoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL2RhdGEvdmVnX2NhbGlmb3JuaWEvY2FfZWNvX2wzL2NhX2Vjb19sMy5zaHAiKQpwdHMgPC0gU3BhdGlhbFBvaW50cyhkYXRhX3MxWyxjKCJsb24iLCJsYXQiKV0sUDRTLmxhdGxvbikKc2hhcGUgPSBzcFRyYW5zZm9ybShzaGFwZSxQNFMubGF0bG9uKQplY28gPSBvdmVyKHB0cywgc2hhcGUpCmRhdGFfczEkTDFDT0RFID0gZWNvJE5BX0wxQ09ERQpkYXRhX3MxJEwzbmFtZSA9IGVjbyRVU19MM05BTUUKZGF0YV9zMSRMMUNPREUgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhdGFfczEkTDFDT0RFKSkKCiNkYXRhX3MxJGxvZ19yb3MgPSBsb2cxMChkYXRhX3MxJG1lYW5fcm9zKQojZGF0YV9zMSRsb2dfcm9zOTUgPSBsb2cxMChkYXRhX3MxJHJvczk1KQojZGF0YV9zMSA9IGRhdGFfczFbZGF0YV9zMSRtZWFuX3JvcyA+MCxdCmRhdGFfczEkaHVtYW5bZGF0YV9zMSRjYXVzZSAhPTEgJiBkYXRhX3MxJGNhdXNlICE9MTQgJiBkYXRhX3MxJGNhdXNlICE9MTddPTEKZGF0YV9zMSRodW1hbltkYXRhX3MxJGNhdXNlID09MSBdPTIKCmRhdGFfczEkcm9zX2ttID0gKGRhdGFfczEkcm9zOTUgKjI0KS8xMDAwCmRhdGFfdGVzdCA9IGRhdGFfczFbZGF0YV9zMSRtYXhfbGFuZCA9PSAxLF0KZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyAsXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSAxMSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgJiAoZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyksXQpkYXRhX3Rlc3QyID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDIgJiAoZGF0YV9zMSRMMUNPREUgPT0gNiB8ZGF0YV9zMSRMMUNPREUgPT0gNyksXQoKZGF0YV90ZXN0MSA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAxICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAsXQoKZGF0YV90ZXN0MT1uYS5vbWl0KGRhdGFfdGVzdDEpCmRhdGFfdGVzdDI9bmEub21pdChkYXRhX3Rlc3QyKQoKCgpwbG90KGRhdGFfczEkcm9zX2ttLCBkYXRhX3MxJG1lYW5fQkFfcmVkLGxvZz0ieCIseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCBjb2w9ImJsYWNrIikKI2F4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQoKCm1hcmtzPWMoMC4wMSwwLjEsMSwxMCkKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfYmFzYV9yb3NfYWxsX3YzLnRpZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBsb3QoZGF0YV9zMSRyb3Nfa20sIGRhdGFfczEkbWVhbl9CQV9yZWQsbG9nPSJ4Iix4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9IlRyZWUgbW9ydGFsaXR5ICglKSIseGxpbT1jKDAuMDA1LDMwKSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfczEkcm9zX2ttLCBkYXRhX3MxJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iYmxhY2siLCBsd2Q9MykKbGluZXMobG93ZXNzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iZGFya2dvbGRlbnJvZDMiLCBsd2Q9MykKbGluZXMobG93ZXNzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iZ3JheTQwIiwgbHdkPTMpCmxlZ2VuZCgidG9wbGVmdCIsbGVnZW5kPWMoImFsbCIsImh1bWFuIiwibGlnaHRuaW5nIiksY29sID0gYygiYmxhY2siLCJkYXJrZ29sZGVucm9kMyIsICJncmF5NDAiKSxsdHk9MSwgYnR5PSJuIixsd2QgPSAzLCBjZXg9MSkKZGV2Lm9mZigpCgoKCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAmIGRhdGFfczEkbWF4X2xhbmQgPDEuNSAmIGRhdGFfczEkcm9zX2ttPjAgLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAyICYgZGF0YV9zMSRtYXhfbGFuZCA8MS41ICYgZGF0YV9zMSRyb3Nfa20+MCxdCmRhdGFfZm9yZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kIDwxLjUgJiBkYXRhX3MxJHJvc19rbT4wLF0KCmRhdGFfdGVzdDE9bmEub21pdChkYXRhX3Rlc3QxKQpkYXRhX3Rlc3QyPW5hLm9taXQoZGF0YV90ZXN0MikKZGF0YV9mb3Jlc3Q9bmEub21pdChkYXRhX2ZvcmVzdCkKCnN1bW1hcnkobG0oZGF0YV9mb3Jlc3QkbWVhbl9CQV9yZWR+KGxvZzEwKGRhdGFfZm9yZXN0JHJvc19rbSkrSSgobG9nMTAoZGF0YV9mb3Jlc3Qkcm9zX2ttKSleMikpKSkKc3VtbWFyeShsb2cxMChkYXRhX2ZvcmVzdCRyb3Nfa20pKQpkYXRhX3MyID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA8MTAsXQpkYXRhX2ZvcmVzdF8xMCA9IGRhdGFfczJbZGF0YV9zMiRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0MV8xMCA9IGRhdGFfczJbZGF0YV9zMiRodW1hbiA9PSAxICYgZGF0YV9zMiRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0Ml8xMCA9IGRhdGFfczJbZGF0YV9zMiRodW1hbiA9PSAyICYgZGF0YV9zMiRtYXhfbGFuZCA8MS41LF0KZGF0YV90ZXN0MV8xMD1uYS5vbWl0KGRhdGFfdGVzdDFfMTApCmRhdGFfdGVzdDJfMTA9bmEub21pdChkYXRhX3Rlc3QyXzEwKQoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX2Jhc2Ffcm9zX2ZvcmVzdF92Ny5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCnBsb3QoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iVHJlZSBtb3J0YWxpdHkgKCUpIix4bGltPWMoMC4wMDUsMzApLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgY29sPSJibGFjayIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQpsaW5lcyhsb3dlc3MoZGF0YV9mb3Jlc3RfMTAkcm9zX2ttLCBkYXRhX2ZvcmVzdF8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxXzEwJHJvc19rbSwgZGF0YV90ZXN0MV8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyXzEwJHJvc19rbSwgZGF0YV90ZXN0Ml8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCmRldi5vZmYoKQoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX2Jhc2Ffcm9zX2ZvcmVzdF92NS5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCnBsb3QoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iVHJlZSBtb3J0YWxpdHkgKCUpIix4bGltPWMoMC4wMDUsMzApLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgY29sPSJibGFjayIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQpsaW5lcyhsb3dlc3MoZGF0YV9mb3Jlc3RfMTAkcm9zX2ttLCBkYXRhX2ZvcmVzdF8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxXzEwJHJvc19rbSwgZGF0YV90ZXN0MV8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyXzEwJHJvc19rbSwgZGF0YV90ZXN0Ml8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCmRldi5vZmYoKQoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19iYXNhX3Jvc19mb3Jlc3RfdjYudGlmIiwgd2lkdGggPSA1LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKcGxvdChkYXRhX2ZvcmVzdCRyb3Nfa20sIGRhdGFfZm9yZXN0JG1lYW5fQkFfcmVkLGxvZz0ieCIseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSJUcmVlIG1vcnRhbGl0eSAoJSkiLHhsaW09YygwLjEsMTUpLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgY29sPSJibGFjayIpCmF4aXMoMSxhdD1tYXJrcyxsYWJlbHM9bWFya3MsY2V4LmF4aXM9MS40ICkKcG9pbnRzKGRhdGFfdGVzdDIkcm9zX2ttLCBkYXRhX3Rlc3QyJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0iZGFya2dyZXkiKQpwb2ludHMoZGF0YV90ZXN0MSRyb3Nfa20sIGRhdGFfdGVzdDEkbWVhbl9CQV9yZWQsY2V4PTAuOCwgY29sPSJvcmFuZ2UiKQpsaW5lcyhsb3dlc3MoZGF0YV9mb3Jlc3RfMTAkcm9zX2ttLCBkYXRhX2ZvcmVzdF8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImJsYWNrIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QxXzEwJHJvc19rbSwgZGF0YV90ZXN0MV8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImRhcmtnb2xkZW5yb2QzIiwgbHdkPTMpCmxpbmVzKGxvd2VzcyhkYXRhX3Rlc3QyXzEwJHJvc19rbSwgZGF0YV90ZXN0Ml8xMCRtZWFuX0JBX3JlZCwgZj0wLjQxKSxjb2w9ImdyYXk0MCIsIGx3ZD0zKQpsZWdlbmQoInRvcGxlZnQiLGxlZ2VuZD1jKCJhbGwiLCJodW1hbiIsImxpZ2h0bmluZyIpLGNvbCA9IGMoImJsYWNrIiwiZGFya2dvbGRlbnJvZDMiLCAiZ3JheTQwIiksbHR5PTEsIGJ0eT0ibiIsbHdkID0gMywgY2V4PTEpCmRldi5vZmYoKQoKCnBsb3QoZGF0YV9mb3Jlc3Qkcm9zX2ttLCBkYXRhX2ZvcmVzdCRtZWFuX0JBX3JlZCxsb2c9IngiLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iVHJlZSBtb3J0YWxpdHkgKCUpIix4bGltPWMoMC4xLDE1KSx4YXh0PSJuIixjZXguYXhpcz0xLjQgLGNleC5sYWI9MS40LGNleD0wLjgsIGNvbD0iYmxhY2siKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCnBvaW50cyhkYXRhX3Rlc3QyJHJvc19rbSwgZGF0YV90ZXN0MiRtZWFuX0JBX3JlZCxjZXg9MC44LCBjb2w9ImRhcmtncmV5IikKcG9pbnRzKGRhdGFfdGVzdDEkcm9zX2ttLCBkYXRhX3Rlc3QxJG1lYW5fQkFfcmVkLGNleD0wLjgsIGNvbD0ib3JhbmdlIikKbGluZXMobG93ZXNzKGRhdGFfZm9yZXN0XzEwJHJvc19rbSwgZGF0YV9mb3Jlc3RfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0MV8xMCRyb3Nfa20sIGRhdGFfdGVzdDFfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJkYXJrZ29sZGVucm9kMyIsIGx3ZD0zKQpsaW5lcyhsb3dlc3MoZGF0YV90ZXN0Ml8xMCRyb3Nfa20sIGRhdGFfdGVzdDJfMTAkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJncmF5NDAiLCBsd2Q9MykKbGVnZW5kKCJ0b3BsZWZ0IixsZWdlbmQ9YygiYWxsIiwiaHVtYW4iLCJsaWdodG5pbmciKSxjb2wgPSBjKCJibGFjayIsImRhcmtnb2xkZW5yb2QzIiwgImdyYXk0MCIpLGx0eT0xLCBidHk9Im4iLGx3ZCA9IDMsIGNleD0xKQoKZGF0YV90ZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kID09IDEsXQoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX2ROQlJfcm9zX2FsbF92Mi5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCnBsb3QoZGF0YV9zMSRyb3Nfa20sIGRhdGFfczEkbWVhbl9kbmJyLGxvZz0ieCIseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSJkTkJSIix4bGltPWMoMC4wMDUsMzApLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgeWxpbT1jKDAsNjAwKSkKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQojbGluZXMobG93ZXNzKGRhdGFfdGVzdCRyb3M5NSwgZGF0YV90ZXN0JG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iYmxhY2siLCBsd2Q9MykKZGV2Lm9mZigpCgptYXJrcz1jKDAuMDEsMC4xLDEsMTApCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWdfcmROQlJfcm9zX2FsbF92Mi5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCnBsb3QoZGF0YV9zMSRyb3Nfa20sIGRhdGFfczEkbWVhbl9yZG5icixsb2c9IngiLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0icmROQlIiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCB5bGltPWMoMCw2MDApKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCiNsaW5lcyhsb3dlc3MoZGF0YV90ZXN0JHJvczk1LCBkYXRhX3Rlc3QkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpkZXYub2ZmKCkKCnRlc3Q9ZGF0YV9zMVtkYXRhX3MxJHJvc19rbT4wLF0Kc3VtbWFyeShsbShsb2cxMCh0ZXN0JHJvc19rbSl+IHRlc3QkbWVhbl9yZG5icitJKHRlc3QkbWVhbl9yZG5icl4yKSkpCnN1bW1hcnkobG0obG9nMTAodGVzdCRyb3Nfa20pfiB0ZXN0JG1lYW5fZG5icikpCgoKbWFya3M9YygwLjAxLDAuMSwxLDEwKQpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvZmlnX2ROQlJfcm9zX25vcnRoX3YyLnBkZiIsIHdpZHRoID0gNSwgaGVpZ2h0ID0gNSkKcGxvdChkYXRhX3Rlc3QxJHJvc19rbSwgZGF0YV90ZXN0MSRtZWFuX2RuYnIsbG9nPSJ4Iix4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9ImROQlIiLHhsaW09YygwLjAwNSwzMCkseGF4dD0ibiIsY2V4LmF4aXM9MS40ICxjZXgubGFiPTEuNCxjZXg9MC44LCB5bGltPWMoMCw2MDApKQpheGlzKDEsYXQ9bWFya3MsbGFiZWxzPW1hcmtzLGNleC5heGlzPTEuNCApCiNsaW5lcyhsb3dlc3MoZGF0YV90ZXN0JHJvczk1LCBkYXRhX3Rlc3QkbWVhbl9CQV9yZWQsIGY9MC40MSksY29sPSJibGFjayIsIGx3ZD0zKQpkZXYub2ZmKCkKCm1hcmtzPWMoMC4wMSwwLjEsMSwxMCkKcGRmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL2ZpZ19kTkJSX3Jvc19zb3V0aF92Mi5wZGYiLCB3aWR0aCA9IDUsIGhlaWdodCA9IDUpCnBsb3QoZGF0YV90ZXN0MiRyb3Nfa20sIGRhdGFfdGVzdDIkbWVhbl9kbmJyLGxvZz0ieCIseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSJkTkJSIix4bGltPWMoMC4wMDUsMzApLHhheHQ9Im4iLGNleC5heGlzPTEuNCAsY2V4LmxhYj0xLjQsY2V4PTAuOCwgeWxpbT1jKDAsNjAwKSkKYXhpcygxLGF0PW1hcmtzLGxhYmVscz1tYXJrcyxjZXguYXhpcz0xLjQgKQojbGluZXMobG93ZXNzKGRhdGFfdGVzdCRyb3M5NSwgZGF0YV90ZXN0JG1lYW5fQkFfcmVkLCBmPTAuNDEpLGNvbD0iYmxhY2siLCBsd2Q9MykKZGV2Lm9mZigpCgoKCmBgYAoKCgojIyMjIyMjIyAgZGlmZmVyZW5jZSBpbiBmaXJlIHNpemUgZm9yIGZpcnN0IDUgZGF5cyBhY3Jvc3MgY2FsaWZvcm5pYSBhbmQgYm90aCBlY29zeXN0ZW1zIAoKYGBge3J9CiAKcmVzJHJvczEgPSByZXMkbWF4X3JvcysxCgoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCmh1bTEgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0xLF0KaHVtMiA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTIsXQpodW0zID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MyxdCmh1bTQgPSBvdXQyW291dDIkZmlyZV9kYXkgPT00LF0KaHVtNSA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTUsXQpsaWcxID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MSxdCmxpZzIgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0yLF0KbGlnMyA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTMsXQpsaWc0ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NCxdCmxpZzUgPSBvdXQxW291dDEkZmlyZV9kYXkgPT01LF0KbWVhbihodW0xJGdyb3d0aCkKbWVhbihodW0yJGdyb3d0aCkKbWVhbihodW0zJGdyb3d0aCkKbWVhbihodW00JGdyb3d0aCkKbWVhbihodW01JGdyb3d0aCkKbWVhbihsaWcxJGdyb3d0aCkKbWVhbihsaWcyJGdyb3d0aCkKbWVhbihsaWczJGdyb3d0aCkKbWVhbihsaWc0JGdyb3d0aCkKbWVhbihsaWc1JGdyb3d0aCkKdC50ZXN0KGxvZzEwKGh1bTEkZ3Jvd3RoKSxsb2cxMChsaWcxJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW0yJGdyb3d0aCksbG9nMTAobGlnMiRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtMyRncm93dGgpLGxvZzEwKGxpZzMkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTQkZ3Jvd3RoKSxsb2cxMChsaWc0JGdyb3d0aCkpCnQudGVzdChsb2cxMChodW01JGdyb3d0aCksbG9nMTAobGlnNSRncm93dGgpKQoKaHVtMSA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTEgJiBvdXQyJGVjbzE9PTYsXQpodW0yID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MiAmIG91dDIkZWNvMT09NixdCmh1bTMgPSBvdXQyW291dDIkZmlyZV9kYXkgPT0zICYgb3V0MiRlY28xPT02LF0KaHVtNCA9IG91dDJbb3V0MiRmaXJlX2RheSA9PTQgJiBvdXQyJGVjbzE9PTYsXQpodW01ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NSAmIG91dDIkZWNvMT09NixdCmxpZzEgPSBvdXQxW291dDEkZmlyZV9kYXkgPT0xICYgb3V0MSRlY28xPT02LF0KbGlnMiA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTIgJiBvdXQxJGVjbzE9PTYsXQpsaWczID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MyAmIG91dDEkZWNvMT09NixdCmxpZzQgPSBvdXQxW291dDEkZmlyZV9kYXkgPT00ICYgb3V0MSRlY28xPT02LF0KbGlnNSA9IG91dDFbb3V0MSRmaXJlX2RheSA9PTUgJiBvdXQxJGVjbzE9PTYsXQptZWFuKGh1bTEkZ3Jvd3RoKQptZWFuKGh1bTIkZ3Jvd3RoKQptZWFuKGh1bTMkZ3Jvd3RoKQptZWFuKGh1bTQkZ3Jvd3RoKQptZWFuKGh1bTUkZ3Jvd3RoKQptZWFuKGxpZzEkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzIkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzMkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzQkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzUkZ3Jvd3RoLCBuYS5ybT1UKQp0LnRlc3QobG9nMTAoaHVtMSRncm93dGgpLGxvZzEwKGxpZzEkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTIkZ3Jvd3RoKSxsb2cxMChsaWcyJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW0zJGdyb3d0aCksbG9nMTAobGlnMyRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNCRncm93dGgpLGxvZzEwKGxpZzQkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTUkZ3Jvd3RoKSxsb2cxMChsaWc1JGdyb3d0aCkpCgpodW0xID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MSAmIG91dDIkZWNvMT09MTEsXQpodW0yID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MiAmIG91dDIkZWNvMT09MTEsXQpodW0zID0gb3V0MltvdXQyJGZpcmVfZGF5ID09MyAmIG91dDIkZWNvMT09MTEsXQpodW00ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NCAmIG91dDIkZWNvMT09MTEsXQpodW01ID0gb3V0MltvdXQyJGZpcmVfZGF5ID09NSAmIG91dDIkZWNvMT09MTEsXQpsaWcxID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MSAmIG91dDEkZWNvMT09MTEsXQpsaWcyID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MiAmIG91dDEkZWNvMT09MTEsXQpsaWczID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09MyAmIG91dDEkZWNvMT09MTEsXQpsaWc0ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NCAmIG91dDEkZWNvMT09MTEsXQpsaWc1ID0gb3V0MVtvdXQxJGZpcmVfZGF5ID09NSAmIG91dDEkZWNvMT09MTEsXQptZWFuKGh1bTEkZ3Jvd3RoKQptZWFuKGh1bTIkZ3Jvd3RoKQptZWFuKGh1bTMkZ3Jvd3RoKQptZWFuKGh1bTQkZ3Jvd3RoKQptZWFuKGh1bTUkZ3Jvd3RoKQptZWFuKGxpZzEkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzIkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzMkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzQkZ3Jvd3RoLCBuYS5ybT1UKQptZWFuKGxpZzUkZ3Jvd3RoLCBuYS5ybT1UKQojdC50ZXN0KGxvZzEwKGh1bTEkZ3Jvd3RoKSxsb2cxMChsaWcxJGdyb3d0aCkpCiN0LnRlc3QobG9nMTAoaHVtMiRncm93dGgpLGxvZzEwKGxpZzIkZ3Jvd3RoKSkKdC50ZXN0KGxvZzEwKGh1bTMkZ3Jvd3RoKSxsb2cxMChsaWczJGdyb3d0aCkpCnQudGVzdChsb2cxMChodW00JGdyb3d0aCksbG9nMTAobGlnNCRncm93dGgpKQp0LnRlc3QobG9nMTAoaHVtNSRncm93dGgpLGxvZzEwKGxpZzUkZ3Jvd3RoKSkKCgpgYGAKCmBgYHtyfQoKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICkKCm1lYW4ob3V0MSRyb3Nfa20sbmEucm09VCkKbWVhbihvdXQyJHJvc19rbSxuYS5ybT1UKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEpCgpoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC4wMSwwLjA1LDAuMSwwLjI1LDAuNSwxLDIsNSwxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUsMzAuNSwzMy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCiMjIyMjIyMjIyMjIyBhdXR1bW4gbm9ydGhlcm4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA5KSkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDkpKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgojIyMjIyMjIyMjIyMgYXV0dW1uIG1lZGl0ZXJlYW4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgZWNvMSA9PSAxMSAmIChtb250aCA+IDkpKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEgJiAobW9udGggPiA5KSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKIyMjIyMjIyMjIyMjIHN1bW1lciBub3J0aGVybiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiAoZWNvMSA9PSA2IHwgZWNvMSA9PSA3KSAmIChtb250aCA+IDUgJiBtb250aDwxMCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA1ICYgbW9udGg8MTApKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuMDEsMC4wNSwwLjEsMC4yNSwwLjUsMSwyLDUsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41LDMwLjUsMzMuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgojIyMjIyMjIyMjIyMgc3VtbWVyIG1lZGl0ZXJlYW4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgZWNvMSA9PSAxMSAgJiAobW9udGggPiA1ICYgbW9udGg8MTApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIGVjbzEgPT0gMTEgICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjAxLDAuMDUsMC4xLDAuMjUsMC41LDEsMiw1LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSwzMC41LDMzLjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKYGBgCgpgYGB7cn0KCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCApCgoKbWVhbihvdXQxJHJvc19rbSxuYS5ybT1UKQptZWFuKG91dDIkcm9zX2ttLG5hLnJtPVQpCiMwLDAuMjUsMC41LDEsMiwzLDUsNywxMCwyMCwzMApoaXN0LmEgPWhpc3Qob3V0MSRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpoaXN0LmIgPWhpc3Qob3V0MiRyb3Nfa20sYnJlYWtzID1jKDAsMC41LDEsMiwzLDUsNywxMCwyMCwzMCkscGxvdD1GKQpmZyA9IHJiaW5kKGhpc3QuYSRjb3VudHMsaGlzdC5iJGNvdW50cykKZGVucyA9IHJiaW5kKChoaXN0LmEkY291bnRzLyhzdW0oaGlzdC5hJGNvdW50cykpKSoxMDAsKGhpc3QuYiRjb3VudHMvKHN1bShoaXN0LmIkY291bnRzKSkpKjEwMCkKCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9Ik51bWJlciBvZiBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iJSBmaXJlIGRheXMiLHlsaW09YygwLDYwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9maWd1cmUyX2ZyZXFfdjEucGRmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA1KQpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSJGaXJlIGRheXMgKCUpIix5bGltPWMoMCw2MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKSAKCgojIyMjIyMjIyMjIyMgYXV0dW1uIG5vcnRoZXJuIGNhbGlmb3JuaWEKb3V0MSA9IHN1YnNldChyZXMsY2F1c2UgPT0gMSAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gOSkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA5KSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQpkZW5zID0gcmJpbmQoKGhpc3QuYSRjb3VudHMvKHN1bShoaXN0LmEkY291bnRzKSkpKjEwMCwoaGlzdC5iJGNvdW50cy8oc3VtKGhpc3QuYiRjb3VudHMpKSkqMTAwKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IiUgZmlyZSBkYXlzIix5bGltPWMoMCw4MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgp0aWZmKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9Eb2N1bWVudHMvYXJ0aWN1bG9zL2VuX3Byb2Nlc28vVklJUlNfcm9zL1M0X2ZyZXFfYXV0dW1uX25vcnRoX3YxLnRpZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPWV4cHJlc3Npb24oJ1JhdGUtb2YtU3ByZWFkIChrbSBkJ14tMSonKScpLHlsYWI9IiUgZmlyZSBkYXlzIix5bGltPWMoMCw4MCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCmRldi5vZmYoKSAKCiMjIyMjIyMjIyMjIyBhdXR1bW4gbWVkaXRlcmVhbiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExICYgKG1vbnRoID4gOSkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSAmIChtb250aCA+IDkpKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCmRlbnMgPSByYmluZCgoaGlzdC5hJGNvdW50cy8oc3VtKGhpc3QuYSRjb3VudHMpKSkqMTAwLChoaXN0LmIkY291bnRzLyhzdW0oaGlzdC5iJGNvdW50cykpKSoxMDApCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iJSBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9TNF9mcmVxX2F1dHVtbl9tZWRfdjEudGlmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iJSBmaXJlIGRheXMiLHlsaW09YygwLDI1KSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpIAoKCiMjIyMjIyMjIyMjIyBzdW1tZXIgbm9ydGhlcm4gY2FsaWZvcm5pYQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICYgKGVjbzEgPT0gNiB8IGVjbzEgPT0gNykgJiAobW9udGggPiA1ICYgbW9udGg8MTApKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCAmIChlY28xID09IDYgfCBlY28xID09IDcpICYgKG1vbnRoID4gNSAmIG1vbnRoPDEwKSkKCmhpc3QuYSA9aGlzdChvdXQxJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmhpc3QuYiA9aGlzdChvdXQyJHJvc19rbSxicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKSxwbG90PUYpCmZnID0gcmJpbmQoaGlzdC5hJGNvdW50cyxoaXN0LmIkY291bnRzKQpkZW5zID0gcmJpbmQoKGhpc3QuYSRjb3VudHMvKHN1bShoaXN0LmEkY291bnRzKSkpKjEwMCwoaGlzdC5iJGNvdW50cy8oc3VtKGhpc3QuYiRjb3VudHMpKSkqMTAwKQoKZnIgPSBiYXJwbG90KGZnLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iTnVtYmVyIG9mIGZpcmUgZGF5cyIsY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZCA9IGMoImh1bWFuIiwibGlnaHRuaW5nIiksIGZpbGw9YygiZ3JleSIsImJsYWNrIiksY2V4PTEuNCxidHkgPSAibiIpCgpmciA9IGJhcnBsb3QoZGVucywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9IiUgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvUzRfZnJlcV9zdW1tZXJfbm9ydGhfdjEudGlmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iJSBmaXJlIGRheXMiLHlsaW09YygwLDYwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpIAoKCiMjIyMjIyMjIyMjIyBzdW1tZXIgbWVkaXRlcmVhbiBjYWxpZm9ybmlhCm91dDEgPSBzdWJzZXQocmVzLGNhdXNlID09IDEgJiBlY28xID09IDExICAmIChtb250aCA+IDUgJiBtb250aDwxMCkpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQocmVzLGNhdXNlICE9MSAmIGNhdXNlICE9IDE0ICYgZWNvMSA9PSAxMSAgJiAobW9udGggPiA1ICYgbW9udGg8MTApKQoKaGlzdC5hID1oaXN0KG91dDEkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKaGlzdC5iID1oaXN0KG91dDIkcm9zX2ttLGJyZWFrcyA9YygwLDAuNSwxLDIsMyw1LDcsMTAsMjAsMzApLHBsb3Q9RikKZmcgPSByYmluZChoaXN0LmEkY291bnRzLGhpc3QuYiRjb3VudHMpCmRlbnMgPSByYmluZCgoaGlzdC5hJGNvdW50cy8oc3VtKGhpc3QuYSRjb3VudHMpKSkqMTAwLChoaXN0LmIkY291bnRzLyhzdW0oaGlzdC5iJGNvdW50cykpKSoxMDApCgpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPSJOdW1iZXIgb2YgZmlyZSBkYXlzIixjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKYXhpcygxLGF0PWMoMC41LDMuNSw2LjUsOS41LDEyLjUsMTUuNSwxOC41LDIxLjUsMjQuNSwyNy41KSxsYWJlbHM9aGlzdC5hJGJyZWFrcyxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKCmZyID0gYmFycGxvdChkZW5zLCBiZXNpZGU9VFJVRSx4bGFiPSJSYXRlLW9mLVNwcmVhZCAoa20vZGF5KSIseWxhYj0iJSBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKdGlmZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9TNF9mcmVxX3N1bW1lcl9tZWRfdjEudGlmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA1LCB1bml0cyA9ICdpbicsIHJlcyA9IDMwMCkKZnIgPSBiYXJwbG90KGRlbnMsIGJlc2lkZT1UUlVFLHhsYWI9ZXhwcmVzc2lvbignUmF0ZS1vZi1TcHJlYWQgKGttIGQnXi0xKicpJykseWxhYj0iJSBmaXJlIGRheXMiLGNleC5sYWI9MS40LGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkgCgoKYGBgCgojIyNidXJudCBhcmVhIGJ5IHJhdGUtb2Ytc3ByZWFkCmBgYHtyfQoKZGF0YV90ZXN0ID0gZGF0YV9zMVtkYXRhX3MxJG1heF9sYW5kID09IDEsXQpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3ICxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkTDFDT0RFID09IDExLF0KCmRhdGFfdGVzdDEgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMSAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCmRhdGFfdGVzdDIgPSBkYXRhX3MxW2RhdGFfczEkaHVtYW4gPT0gMiAmIChkYXRhX3MxJEwxQ09ERSA9PSA2IHxkYXRhX3MxJEwxQ09ERSA9PSA3KSxdCgpkYXRhX3Rlc3QxID0gZGF0YV9zMVtkYXRhX3MxJGh1bWFuID09IDEgLF0KZGF0YV90ZXN0MiA9IGRhdGFfczFbZGF0YV9zMSRodW1hbiA9PSAyICxdCgpmYXN0ID0gZGF0YV90ZXN0MVtkYXRhX3Rlc3QxJHJvc19rbSA+IDMuNjQsXQpzdW0oZmFzdCRzaXplLG5hLnJtPVQpL3N1bShkYXRhX3Rlc3QxJHNpemUsbmEucm09VCkKc3VtKChkYXRhX3Rlc3QxJHNpemUqZGF0YV90ZXN0MSRyb3Nfa20pLG5hLnJtPVQpL3N1bShkYXRhX3Rlc3QxJHNpemUsbmEucm09VCkKCmZhc3QgPSBkYXRhX3Rlc3QyW2RhdGFfdGVzdDIkcm9zX2ttID4gMi4yLF0Kc3VtKGZhc3Qkc2l6ZSxuYS5ybT1UKS9zdW0oZGF0YV90ZXN0MiRzaXplLG5hLnJtPVQpCnN1bSgoZGF0YV90ZXN0MiRzaXplKmRhdGFfdGVzdDIkcm9zX2ttKSxuYS5ybT1UKS9zdW0oZGF0YV90ZXN0MiRzaXplLG5hLnJtPVQpCgpmYXN0ID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA+IDEsXQpmYXN0X2h1bSA9IGZhc3RbZmFzdCRodW1hbiA9PSAxLF0KCnByaW50KCIlIEJBIGFuZCAlIG9mIGZpcmUgZGF5cyBmYXN0IGZpcmVzID4gMWttL2RheSIpCnN1bShmYXN0JHNpemUpL3N1bShkYXRhX3MxJHNpemUpCmxlbmd0aChmYXN0JHNpemUpL2xlbmd0aChkYXRhX3MxJHNpemUpCgpwcmludCgiJSBCQSAgZmFzdCBmaXJlcyBkdWUgdG8gaHVtYW4gaWduaXRpb24gJSBvZiBmaXJlIGRheXMgaHVtYW4gY2F1c2VkIGZhc3QgZmlyZXMgPiAxa20vZGF5IikKc3VtKGZhc3RfaHVtJHNpemUsIG5hLnJtPVQpL3N1bShmYXN0JHNpemUpCmxlbmd0aChmYXN0X2h1bSRzaXplKS9sZW5ndGgoZmFzdCRzaXplKQoKYWxsX21pbjEgPSBkYXRhX3MxW2RhdGFfczEkbnJfZGF5ICE9IDEsXSAjIHJlbW92ZSBmaXJzdCBmaXJlIHNwcmVhZCBkYXkgZnJvbSBzdGF0aXN0aWNzCgpxdWFuID0gcXVhbnRpbGUoZGF0YV9zMSRyb3Nfa20sMC45KQpmYXN0ID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA+IHF1YW4sXQpzbG93ID0gZGF0YV9zMVtkYXRhX3MxJHJvc19rbSA8IHF1YW4sXQpmYXN0X2h1bSA9IGZhc3RbZmFzdCRodW1hbiA9PSAxLF0KCnByaW50KCJmYXN0ZXN0IDEwJSBmaXJlcyBjYXVzZSB4eHglIG9mIEJBIikKc3VtKGZhc3Qkc2l6ZSkvc3VtKGFsbF9taW4xJHNpemUpCmxlbmd0aChmYXN0JHNpemUpL2xlbmd0aChhbGxfbWluMSRzaXplKQpwcmludCgibWVhbiB0cmVlIG1vcnRhbGl0eSB3ZWlnaHRlZCBieSBCQSBhbmQganVzdCBtZWFuIikKc3VtKChkYXRhX3MxJG1lYW5fQkFfcmVkKmRhdGFfczEkc2l6ZSkpLyhzdW0oZGF0YV9zMSRzaXplKSkKbWVhbihkYXRhX3MxJG1lYW5fQkFfcmVkKQoKcHJpbnQoIiUgQkEgZHVlIHRvIGh1bWFuIGZpcmVzIGFtb3VuZyBmYXN0ZXN0IDEwJSBmaXJlIGRheXMiKQpzdW0oZmFzdF9odW0kc2l6ZSwgbmEucm09VCkvc3VtKGZhc3Qkc2l6ZSkKcHJpbnQoIiUgZmlyZSBudW1iZXIgZHVlIHRvIGh1bWFuIGZpcmVzIGFtb3VuZyBmYXN0ZXN0IDEwJSBmaXJlIGRheXMiKQpsZW5ndGgoZmFzdF9odW0kc2l6ZSkvbGVuZ3RoKGZhc3Qkc2l6ZSkKcHJpbnQoIiUgdHJlZSBtb3J0YWxpdHkgZmFzdCBmaXJlcyB3ZWlnaHRoZWQgYW5kIG5vdCIpCnN1bSgoZmFzdCRtZWFuX0JBX3JlZCpmYXN0JHNpemUpKS8oc3VtKGZhc3Qkc2l6ZSkpCm1lYW4oZmFzdCRtZWFuX0JBX3JlZCkKcHJpbnQoIiUgdHJlZSBtb3J0YWxpdHkgc2xvdyBmaXJlcyB3ZWlnaHRoZWQgYW5kIG5vdCIpCnN1bSgoc2xvdyRtZWFuX0JBX3JlZCpzbG93JHNpemUpKS8oc3VtKHNsb3ckc2l6ZSkpCm1lYW4oc2xvdyRtZWFuX0JBX3JlZCkKCnByaW50KCJ0cmVlIG1vcnRhbGl0eSA8MC41a20gYW5kID4ya20iKQpmYXN0MSA9IGRhdGFfczFbZGF0YV9zMSRyb3Nfa20gPiAyLF0Kc2xvdzEgPSBkYXRhX3MxW2RhdGFfczEkcm9zX2ttIDwgMC41LF0KbWVhbihmYXN0MSRtZWFuX0JBX3JlZCxvbWl0Lm5hPVQgKQptZWFuKHNsb3cxJG1lYW5fQkFfcmVkLG9taXQubmE9VCApCgojIHBsb3QgQkEgcGVyIHJhdGUgb2Ygc3ByZWFkIApvdXQxID0gc3Vic2V0KGRhdGFfczEsY2F1c2UgPT0gMSApICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCm91dDIgPSBzdWJzZXQoZGF0YV9zMSxjYXVzZSAhPTEgJiBjYXVzZSAhPSAxNCApCgpicmVha3MgPWMoMCwwLjUsMSwyLDMsNSw3LDEwLDIwLDMwKQoKdHQ9MApwcD0wCmZvciAoaSBpbiAxOjkpewoKICBrciA9IG91dDFbb3V0MSRyb3Nfa20gPj0gYnJlYWtzW2ldICYgb3V0MSRyb3Nfa20gPCBicmVha3NbaSsxXSxdCiAga3AgPSBvdXQyW291dDIkcm9zX2ttID49IGJyZWFrc1tpXSAmIG91dDIkcm9zX2ttIDwgYnJlYWtzW2krMV0sXQoKdHRbaV09c3VtKGtyJHNpemUsIG5hLnJtPVQpLzEwMDAwMDAKcHBbaV09IHN1bShrcCRzaXplLCBuYS5ybT1UKS8xMDAwMDAwCn0Kc3VtKHR0KQpzdW0ocHApCmZnID0gcmJpbmQodHQscHApCgpwYXIobWFyPWMoNCwgNSwgMiwwLjEpKQpmciA9IGJhcnBsb3QoZmcsIGJlc2lkZT1UUlVFLHhsYWI9IlJhdGUtb2YtU3ByZWFkIChrbS9kYXkpIix5bGFiPWV4cHJlc3Npb24oJ2J1cm50IGFyZWEgKGttJ14yKicpJykseWxpbT1jKDAsMjAwMCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPSBicmVha3MgLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQoKCnRpZmYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvQkFfcGVyX3Jvc19oaXN0LnRpZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAnaW4nLCByZXMgPSAzMDApCnBhcihtYXI9Yyg0LCA1LCAyLDAuMSkpCmZyID0gYmFycGxvdChmZywgYmVzaWRlPVRSVUUseGxhYj0iUmF0ZS1vZi1TcHJlYWQgKGttL2RheSkiLHlsYWI9ZXhwcmVzc2lvbignYnVybnQgYXJlYSAoa20nXjIqJyknKSx5bGltPWMoMCwyMDAwKSxjZXgubGFiPTEuNCxjZXguYXhpcyA9IDEuMykKI2F4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPWhpc3QuYSRicmVha3MsY2V4LmF4aXMgPSAxLjMpCmF4aXMoMSxhdD1jKDAuNSwzLjUsNi41LDkuNSwxMi41LDE1LjUsMTguNSwyMS41LDI0LjUsMjcuNSksbGFiZWxzPSBicmVha3MgLGNleC5heGlzID0gMS4zKQpsZWdlbmQoInRvcHJpZ2h0IixsZWdlbmQgPSBjKCJodW1hbiIsImxpZ2h0bmluZyIpLCBmaWxsPWMoImdyZXkiLCJibGFjayIpLGNleD0xLjQsYnR5ID0gIm4iKQpkZXYub2ZmKCkgCgoKZmcxPXJiaW5kKCh0dC9zdW0odHQpKSoxMDAsKHBwL3N1bShwcCkpKjEwMCkKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9CQV9wZXJfcm9zX2hpc3RfcGVyY2VudGFnZS5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDUpCiNwYXIobWFyPWMoMSwgMSwgMSwxKSkKZnIgPSBiYXJwbG90KGZnMSwgYmVzaWRlPVRSVUUseGxhYj1leHByZXNzaW9uKCdSYXRlLW9mLVNwcmVhZCAoa20gZCdeLTEqJyknKSx5bGFiPSAiQnVybmVkIGFyZWEgKCUpIix5bGltPWMoMCwzMCksY2V4LmxhYj0xLjQsY2V4LmF4aXMgPSAxLjMpCiNheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz1oaXN0LmEkYnJlYWtzLGNleC5heGlzID0gMS4zKQpheGlzKDEsYXQ9YygwLjUsMy41LDYuNSw5LjUsMTIuNSwxNS41LDE4LjUsMjEuNSwyNC41LDI3LjUpLGxhYmVscz0gYnJlYWtzICxjZXguYXhpcyA9IDEuMykKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kID0gYygiaHVtYW4iLCJsaWdodG5pbmciKSwgZmlsbD1jKCJncmV5IiwiYmxhY2siKSxjZXg9MS40LGJ0eSA9ICJuIikKZGV2Lm9mZigpIAoKCgpgYGAKCgoKIyMjIyMjIyMjIyMjIyMjIyMgMjAgZmFzdGVzdCBmaXJlcyAgIyMjIyMjIyMjIyMjIwpgYGB7cn0KCnJlczEgPSByZXNbcmVzJHJvc19rbSA+IDEwICYgIWlzLm5hKHJlcyRyb3Nfa20pLF0KbGVuZ3RoKHJlczEkcm9zX2ttKQpyZXMxCmBgYAoKCiMjIyMjIyMjIyMjIyBhcmUgUk9TIHRoZSBzYW1lIGZvciBsaWdodCAmIGh1bWFuIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMKCmBgYHtyfQpvdXQxID0gc3Vic2V0KHJlcyxjYXVzZSA9PSAxICkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsY2F1c2UgIT0xICYgY2F1c2UgIT0gMTQgKQoKcGxvdChvdXQxJHZwZCxsb2cob3V0MSRyb3Nfa20pKQpwb2ludHMob3V0MiR2cGQsbG9nKG91dDIkcm9zX2ttKSxjb2w9InJlZCIpCgpzdW1tYXJ5KGxtKG91dDEkdnBkfmxvZyhvdXQxJHJvc19rbSsxKSxuYS5vbWl0PVQpKQpzdW1tYXJ5KGxtKG91dDIkdnBkfmxvZyhvdXQyJHJvc19rbSsxKSkpCgpgYGAKCgoKCgojIyMjIyMjIyMjIyMjIyBhbmFseXNpcyBvZiB0aGUgZmlyc3QgZGF5ICMjIyMjIyMjIyMjIyMjIyMjCgpsb2FkIGRhdGEKYGBge3J9CgpkYWlseV9yZXM9cmVhZC50YWJsZSgiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvcHJvamVjdHMvVklJUlNfcm9zL2FsbF9pZ25pdGlvbnNfVjMudHh0IixoZWFkZXI9VCkKCnJlcz1hcy5kYXRhLmZyYW1lKGRhaWx5X3JlcykKCnJlcyRiaSA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGJpKSkKcmVzJGVyYyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJGVyYykpCnJlcyRldHIgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRldHIpKQpyZXMkZm0xMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMCkpCnJlcyRmbTEwMDAgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyRmbTEwMDApKQpyZXMkcGV0ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcGV0KSkKcmVzJHByID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkcHIpKQpyZXMkcm1heCA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtYXgpKQpyZXMkcm1pbiA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHJtaW4pKQpyZXMkdGggPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0aCkpCnJlcyR0bW1uID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1tbikpCnJlcyR0bW14ID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkdG1teCkpCnJlcyR2cGQgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR2cGQpKQpyZXMkd3MgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR3cykpCnJlcyR2cyA9YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocmVzJHZzKSkKcmVzJHRvdGFsX2FyZWEgPWFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHJlcyR0b3RhbF9hcmVhKSkKcmVzJG1heF9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWF4X2xhbmQpKQpyZXMkbWVhbl9sYW5kID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkbWVhbl9sYW5kKSkKCnJlcyRiaW9tYXNzID1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihyZXMkYmlvbWFzcykpCgpyZXMgPSByZXNbLTEsXQpyZXMkaHVtYW5bcmVzJGNhdXNlID09MV0gPTEKcmVzJGh1bWFuW3JlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0xNF0gPTAKCmBgYAoKYW5hbHlzaXMKCmBgYHtyfQoKb3V0MSA9IHJlc1tyZXMkY2F1c2UgIT0xICYgcmVzJGNhdXNlICE9IDE0LF0gCm91dDIgPSByZXNbcmVzJGNhdXNlID09MSxdIApsZW5ndGgob3V0MSRiaSkKbGVuZ3RoKG91dDIkYmkpCgpvdXQxID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24Kb3V0MiA9IHN1YnNldChyZXMsKGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAmIHJlcyRjYXVzZSA9PTEpICAgIzE9bGlnaHRuaW5nOyAxND11bmtub3duOyA3PWFyc29uCmxlbmd0aChvdXQxJGJpKQpsZW5ndGgob3V0MiRiaSkKCm91dDEgPSBzdWJzZXQocmVzLGVjbzEgPT0gMTEmIHJlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0gMTQpCm91dDIgPSBzdWJzZXQocmVzLGVjbzEgPT0gMTEgJiByZXMkY2F1c2UgPT0xKQpsZW5ndGgob3V0MSRiaSkKbGVuZ3RoKG91dDIkYmkpCgpvdXQxID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlICE9MSAmIHJlcyRjYXVzZSAhPSAxNCAmIHJlcyRtb250ID4gNSAmIHJlcyRtb250IDwgMTAgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlID09MSYgcmVzJG1vbnQgPiA1ICYgcmVzJG1vbnQgPCAxMCkgICAjMT1saWdodG5pbmc7IDE0PXVua25vd247IDc9YXJzb24KbGVuZ3RoKG91dDEkYmkpCmxlbmd0aChvdXQyJGJpKQoKb3V0MSA9IHN1YnNldChyZXMsKGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAmIHJlcyRjYXVzZSAhPTEgJiByZXMkY2F1c2UgIT0gMTQgJiByZXMkbW9udCA8IDYgJiByZXMkbW9udCA+IDkgKSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcywoZWNvMSA9PSA2IHxlY28xID09IDcpICYgcmVzJGNhdXNlID09MSYgcmVzJG1vbnQgPCA2ICYgcmVzJG1vbnQgPiA5KSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgoKbGVuZ3RoKG91dDEkYmkpCmxlbmd0aChvdXQyJGJpKQoKCnQudGVzdChvdXQxJGJpLG91dDIkYmkpCnQudGVzdChvdXQxJGVyYyxvdXQyJGVyYykKdC50ZXN0KG91dDEkZXRyLG91dDIkZXRyKQp0LnRlc3Qob3V0MSRmbTEwMCxvdXQyJGZtMTAwKQp0LnRlc3Qob3V0MSRmbTEwMDAsb3V0MiRmbTEwMDApCnQudGVzdChvdXQxJHBldCxvdXQyJHBldCkKdC50ZXN0KG91dDEkcHIsb3V0MiRwcikKdC50ZXN0KG91dDEkcm1heCxvdXQyJHJtYXgpCnQudGVzdChvdXQxJHJtaW4sb3V0MiRybWluKQp0LnRlc3Qob3V0MSR0aCxvdXQyJHRoKQp0LnRlc3Qob3V0MSR0bW1uLG91dDIkdG1tbikKdC50ZXN0KG91dDEkdG1teCxvdXQyJHRtbXgpCnQudGVzdChvdXQxJHZwZCxvdXQyJHZwZCkKdC50ZXN0KG91dDEkdnMsb3V0MiR2cykKdC50ZXN0KG91dDEkd3Msb3V0MiR3cykKdC50ZXN0KG91dDEkYmlvbWFzcyxvdXQyJGJpb21hc3MpCnQudGVzdChvdXQxJG1lYW5fbGFuZCxvdXQyJG1lYW5fbGFuZCkKdC50ZXN0KGxvZzEwKG91dDEkdG90YWxfYXJlYSksbG9nMTAob3V0MiR0b3RhbF9hcmVhKSkKCgoKYGBgCgpgYGB7cn0KCnRhID0gdGFibGUocmVzJGh1bWFuLHJlcyRtb250KQpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvUzlhX3YxLnBkZiIsIHdpZHRoID0gNywgaGVpZ2h0ID0gNikKcHMgPSBiYXJwbG90KHRhLCBiZXNpZGU9VFJVRSwgeWxhYj0iTnVtYmVyIG9mIGZpcmVzIix4cGQ9VCx4bGFiPSAiTW9udGgiLCB4YXh0PSduJyx5bGltPWMoMCwzMDApLCBheGlzLmx0eT0xLGNleC5sYWIgPSAxLjUsY2V4LmF4aXMgPSAxLjQgKQpheGlzKDEsYXQ9YygyLDUsOCwxMSwxNCwxNywyMCwyMywyNiwyOSwzMiwzNSksIGxhYmVscyA9YygxOjEyKSx4bGltPWMoMCwzNikseHBkPUYgLGNleC5sYWIgPSAxLjQsY2V4LmF4aXMgPSAxLjMpCmxlZ2VuZCgidG9wcmlnaHQiLGMoImh1bWFuIiwibGlnaHRuaW5nIiksZmlsbCA9IGMoImJsYWNrIiwiZ3JleSIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoNSwyODUsImEpIENhbGlmb3JuaWEiLGNleD0xLjcpCmRldi5vZmYoKSAKCm91dDEgPSBzdWJzZXQocmVzLGVjbzEgPT0gNiB8ZWNvMSA9PSA3KSAgICMxPWxpZ2h0bmluZzsgMTQ9dW5rbm93bjsgNz1hcnNvbgpvdXQyID0gc3Vic2V0KHJlcyxlY28xID09IDExKQoKdGEgPSB0YWJsZShvdXQxJGh1bWFuLG91dDEkbW9udCkKCnBkZigiL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvRG9jdW1lbnRzL2FydGljdWxvcy9lbl9wcm9jZXNvL1ZJSVJTX3Jvcy9TOWJfdjEucGRmIiwgd2lkdGggPSA3LCBoZWlnaHQgPSA2KQpwcyA9IGJhcnBsb3QodGEsIGJlc2lkZT1UUlVFLCB5bGFiPSJOdW1iZXIgb2YgZmlyZXMiLHhwZD1ULCB4YXh0PSduJyx4bGFiPSAiTW9udGgiLCB5bGltPWMoMCwyMDApLCBheGlzLmx0eT0xLGNleC5sYWIgPSAxLjUsY2V4LmF4aXMgPSAxLjQgKQpheGlzKDEsYXQ9YygyLDUsOCwxMSwxNCwxNywyMCwyMywyNiwyOSwzMiwzNSksIGxhYmVscyA9YygxOjEyKSx4bGltPWMoMCwzNikseHBkPUYsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMyApCmxlZ2VuZCgidG9wcmlnaHQiLGMoImh1bWFuIiwibGlnaHRuaW5nIiksZmlsbCA9IGMoImJsYWNrIiwiZ3JleSIpLCBidHk9Im4iLGNleD0xLjQpCnRleHQoOSwxOTAsImIpIE5vcnRoZXJuIENhbGlmb3JuaWEiLGNleD0xLjcpCmRldi5vZmYoKSAKCnRhID0gdGFibGUob3V0MiRodW1hbixvdXQyJG1vbnQpCgpwZGYoIi9Vc2Vycy9zdGlqbmhhbnRzb24vRG9jdW1lbnRzL0RvY3VtZW50cy9hcnRpY3Vsb3MvZW5fcHJvY2Vzby9WSUlSU19yb3MvUzljX3YxLnBkZiIsIHdpZHRoID0gNywgaGVpZ2h0ID0gNikKcHMgPSBiYXJwbG90KHRhLCBiZXNpZGU9VFJVRSwgeWxhYj0iTnVtYmVyIG9mIGZpcmVzIix4cGQ9VCx4YXh0PSduJyx4bGFiPSAiTW9udGgiLCB5bGltPWMoMCwyMDApLCBheGlzLmx0eT0xLGNleC5sYWIgPSAxLjUsY2V4LmF4aXMgPSAxLjQgKQpheGlzKDEsYXQ9YygyLDUsOCwxMSwxNCwxNywyMCwyMywyNiwyOSwzMiwzNSksIGxhYmVscyA9YygxOjEyKSx4bGltPWMoMCwzNikseHBkPUYsY2V4LmxhYiA9IDEuNCxjZXguYXhpcyA9IDEuMyApCmxlZ2VuZCgidG9wcmlnaHQiLGMoImh1bWFuIiwibGlnaHRuaW5nIiksZmlsbCA9IGMoImJsYWNrIiwgImdyZXkiKSwgYnR5PSJuIixjZXg9MS40KQp0ZXh0KDExLjIsMTkwLCJjKSBNZWRpdGVycmFuZWFuIENhbGlmb3JuaWEiLGNleD0xLjcpCmRldi5vZmYoKSAKCnBzID0gYmFycGxvdCh0YSwgYmVzaWRlPVRSVUUsIHlsYWI9Ik51bWJlciBvZiBmaXJlcyIseHBkPVQseGF4dD0nbicseGxhYj0gIk1vbnRoIiwgeWxpbT1jKDAsMjAwKSwgYXhpcy5sdHk9MSxjZXgubGFiID0gMS41LGNleC5heGlzID0gMS40ICkKYXhpcygxLGF0PWMoMiw1LDgsMTEsMTQsMTcsMjAsMjMsMjYsMjksMzIsMzUpLCBsYWJlbHMgPWMoMToxMikseGxpbT1jKDAsMzYpLHhwZD1GLGNleC5sYWIgPSAxLjQsY2V4LmF4aXMgPSAxLjMgKQpsZWdlbmQoInRvcHJpZ2h0IixjKCJodW1hbiIsImxpZ2h0bmluZyIpLGZpbGwgPSBjKCJibGFjayIsICJncmV5IiksIGJ0eT0ibiIsY2V4PTEuNCkKCgpgYGAKCgojIyMjIyMjIyMjIyMgIGFuYWx5c2lzIG9mIE1UQlMgdGVtcG9yYWwgdHJlbmQgICAjIyMjIyMjIyMjIyMjIyMKYGBge3J9CmxpYnJhcnkocmFzdGVyKQpsaWJyYXJ5KHJnZW9zKQptdGJzX2Rpcj0iL1VzZXJzL3N0aWpuaGFudHNvbi9Eb2N1bWVudHMvZGF0YS9NVEJTL0RBVEEvIgptZWQ9c2hhcGVmaWxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL3ZlZ19jYWxpZm9ybmlhL21lZF9jYWwuc2hwIikKbm9ydGg9c2hhcGVmaWxlKCIvVXNlcnMvc3Rpam5oYW50c29uL0RvY3VtZW50cy9kYXRhL3ZlZ19jYWxpZm9ybmlhL25vcnRoX2NhbC5zaHAiKQoKeWVhcj0xOTg0Cms9MApkbmJyX2FsbF9tZWQ9MApyZG5icl9hbGxfbWVkPTAKZG5icl9hbGxfbm9yPTAKcmRuYnJfYWxsX25vcj0wCgpsZW5fZG5icl9tZWQ9MApsZW5fcmRuYnJfbWVkPTAKbGVuX2RuYnJfbm9yPTAKbGVuX3JkbmJyX25vcj0wCmZvciAoeWVhciBpbiAxOTg0OjIwMTcpewogIHByaW50KHllYXIpCiAgaz1rKzEKbXRic19kaXJfeWVhciA9IHBhc3RlKG10YnNfZGlyLHllYXIsIi8iLHNlcD0iIikKYm5keV9saXN0ID0gbGlzdC5maWxlcyhtdGJzX2Rpcl95ZWFyLCBwYXR0ZXJuID0gImJ1cm5fYm5keS5zaHAkIiwgcmVjdXJzaXZlID0gVCwgZnVsbC5uYW1lcz1UKQpzaGFwZWZpbGVfbGlzdCA8LSBsYXBwbHkoYm5keV9saXN0LCBzaGFwZWZpbGUpCmZpcmVzIDwtIGRvLmNhbGwocmJpbmQsIHNoYXBlZmlsZV9saXN0KQpmaXJlcz1nVW5hcnlVbmlvbihmaXJlcykKZmlyZV9ub3J0aCA9IGludGVyc2VjdChmaXJlcyxub3J0aCkKZmlyZV9tZWQgPSBpbnRlcnNlY3QoZmlyZXMsbWVkKQoKZG5iciA9IHJhc3RlcihwYXN0ZShtdGJzX2Rpcix5ZWFyLCJfZG5ici50aWYiLHNlcD0iIikpCiAgZG5icltkbmJyIDwgLTIwMDBdIDwtIE5BCiAgcmRuYnIgPSBkbmJyID0gcmFzdGVyKHBhc3RlKG10YnNfZGlyLHllYXIsIl9yZG5ici50aWYiLHNlcD0iIikpCiAgcmRuYnJbcmRuYnIgPCAtMjAwMF0gPC0gTkEKICAKZG5icl9leHRfbWVkID0gZXh0cmFjdChkbmJyLGZpcmVfbWVkKQpkbmJyX2V4dF9ub3IgPSBleHRyYWN0KGRuYnIsZmlyZV9ub3J0aCkKCnJkbmJyX2V4dF9tZWQgPSBleHRyYWN0KHJkbmJyLGZpcmVfbWVkKQpyZG5icl9leHRfbm9yID0gZXh0cmFjdChyZG5icixmaXJlX25vcnRoKQoKZG5icl9hbGxfbWVkW2tdPW1lYW4odW5saXN0KGRuYnJfZXh0X21lZCksbmEucm09VCkKcmRuYnJfYWxsX21lZFtrXT1tZWFuKHVubGlzdChyZG5icl9leHRfbWVkKSxuYS5ybT1UKQpkbmJyX2FsbF9ub3Jba109bWVhbih1bmxpc3QoZG5icl9leHRfbm9yKSxuYS5ybT1UKQpyZG5icl9hbGxfbm9yW2tdPW1lYW4odW5saXN0KHJkbmJyX2V4dF9ub3IpLG5hLnJtPVQpCgpsZW5fZG5icl9tZWRba10gPSBsZW5ndGgodW5saXN0KGRuYnJfZXh0X21lZCkpCmxlbl9yZG5icl9tZWRba10gPSBsZW5ndGgodW5saXN0KHJkbmJyX2V4dF9tZWQpKQpsZW5fZG5icl9ub3Jba10gPSBsZW5ndGgodW5saXN0KGRuYnJfZXh0X25vcikpCmxlbl9yZG5icl9ub3Jba10gPSBsZW5ndGgodW5saXN0KHJkbmJyX2V4dF9ub3IpKQpyZW1vdmVUbXBGaWxlcygwKQpnYygpCn0KCgpgYGAKCgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgoKCmBgYAoKCgoKCgo=